debugger-aarch64.cc revision 88c46b84df005638546de5e4e965bdcc31352f48
15289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl// Copyright 2014, ARM Limited 2ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// All rights reserved. 3ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// 4ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Redistribution and use in source and binary forms, with or without 5ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// modification, are permitted provided that the following conditions are met: 6ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// 7ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// * Redistributions of source code must retain the above copyright notice, 8ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// this list of conditions and the following disclaimer. 9ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// * Redistributions in binary form must reproduce the above copyright notice, 10ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// this list of conditions and the following disclaimer in the documentation 11ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// and/or other materials provided with the distribution. 12ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// * Neither the name of ARM Limited nor the names of its contributors may be 13ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// used to endorse or promote products derived from this software without 14ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// specific prior written permission. 15ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// 16ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// THIS SOFTWARE IS PROVIDED BY ARM LIMITED AND CONTRIBUTORS "AS IS" AND ANY 17ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// DISCLAIMED. IN NO EVENT SHALL ARM LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, 20ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 22ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 25ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 27684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl#ifdef VIXL_INCLUDE_SIMULATOR 28b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl 2939c32a63e09751de64d079db9095648e02bf2c1fAlexandre Rames#include "a64/debugger-a64.h" 30ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 31ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlnamespace vixl { 3288c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace aarch64 { 33ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 34ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// List of commands supported by the debugger. 350f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl#define DEBUG_COMMAND_LIST(C) \ 360f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(HelpCommand) \ 370f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(ContinueCommand) \ 380f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(StepCommand) \ 390f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(DisasmCommand) \ 400f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(PrintCommand) \ 410f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl C(ExamineCommand) 42ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 43ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Debugger command lines are broken up in token of different type to make 44ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// processing easier later on. 45ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass Token { 46ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 47ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~Token() {} 48ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 49ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Token type. 50ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsRegister() const { return false; } 51ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsFPRegister() const { return false; } 52ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsIdentifier() const { return false; } 53ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsAddress() const { return false; } 54ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsInteger() const { return false; } 55ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsFormat() const { return false; } 56ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsUnknown() const { return false; } 57ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Token properties. 58ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool CanAddressMemory() const { return false; } 59684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl virtual uint8_t* ToAddress(Debugger* debugger) const = 0; 60ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const = 0; 61ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 62ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 63ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 64ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 65ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Tokens often hold one value. 660f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixltemplate <typename T> 670f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlclass ValueToken : public Token { 68ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 69ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit ValueToken(T value) : value_(value) {} 70ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl ValueToken() {} 71ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 72ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl T value() const { return value_; } 73ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 74684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_NO_RETURN virtual uint8_t* ToAddress(Debugger* debugger) const { 75684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl USE(debugger); 76684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_ABORT(); 77684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl } 78684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl 79ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl protected: 80ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl T value_; 81ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 82ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 83ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Integer registers (X or W) and their aliases. 84ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Format: wn or xn with 0 <= n < 32 or a name in the aliases list. 85ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass RegisterToken : public ValueToken<const Register> { 86ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 87ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit RegisterToken(const Register reg) 88ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl : ValueToken<const Register>(reg) {} 89ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 90ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsRegister() const { return true; } 91ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool CanAddressMemory() const { return value().Is64Bits(); } 92ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual uint8_t* ToAddress(Debugger* debugger) const; 930f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl virtual void Print(FILE* out = stdout) const; 94ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* Name() const; 95ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 96ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 97ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static RegisterToken* Cast(Token* tok) { 98b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsRegister()); 99ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<RegisterToken*>(tok); 100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const int kMaxAliasNumber = 4; 104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kXAliases[kNumberOfRegisters][kMaxAliasNumber]; 105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kWAliases[kNumberOfRegisters][kMaxAliasNumber]; 106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Floating point registers (D or S). 109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Format: sn or dn with 0 <= n < 32. 110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass FPRegisterToken : public ValueToken<const FPRegister> { 111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit FPRegisterToken(const FPRegister fpreg) 113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl : ValueToken<const FPRegister>(fpreg) {} 114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsFPRegister() const { return true; } 1160f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl virtual void Print(FILE* out = stdout) const; 117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static FPRegisterToken* Cast(Token* tok) { 120b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsFPRegister()); 121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<FPRegisterToken*>(tok); 122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Non-register identifiers. 127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Format: Alphanumeric string starting with a letter. 128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass IdentifierToken : public ValueToken<char*> { 129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit IdentifierToken(const char* name) { 131db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl size_t size = strlen(name) + 1; 132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl value_ = new char[size]; 133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl strncpy(value_, name, size); 134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~IdentifierToken() { delete[] value_; } 136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsIdentifier() const { return true; } 138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool CanAddressMemory() const { return strcmp(value(), "pc") == 0; } 139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual uint8_t* ToAddress(Debugger* debugger) const; 140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const; 141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static IdentifierToken* Cast(Token* tok) { 144b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsIdentifier()); 145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<IdentifierToken*>(tok); 146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// 64-bit address literal. 150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Format: 0x... with up to 16 hexadecimal digits. 151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass AddressToken : public ValueToken<uint8_t*> { 152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit AddressToken(uint8_t* address) : ValueToken<uint8_t*>(address) {} 154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsAddress() const { return true; } 156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool CanAddressMemory() const { return true; } 157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual uint8_t* ToAddress(Debugger* debugger) const; 1580f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl virtual void Print(FILE* out = stdout) const; 159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static AddressToken* Cast(Token* tok) { 162b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsAddress()); 163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<AddressToken*>(tok); 164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// 64-bit decimal integer literal. 169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Format: n. 170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass IntegerToken : public ValueToken<int64_t> { 171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 172db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl explicit IntegerToken(int64_t value) : ValueToken<int64_t>(value) {} 173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsInteger() const { return true; } 175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const; 176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static IntegerToken* Cast(Token* tok) { 179b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsInteger()); 180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<IntegerToken*>(tok); 181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Literal describing how to print a chunk of data (up to 64 bits). 185f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// Format: .ln 186f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// where l (letter) is one of 187f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// * x: hexadecimal 188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// * s: signed integer 189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// * u: unsigned integer 190f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// * f: floating point 191f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// * i: instruction 192f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// and n (size) is one of 8, 16, 32 and 64. n should be omitted for 193f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl// instructions. 194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass FormatToken : public Token { 195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl FormatToken() {} 197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsFormat() const { return true; } 199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual int SizeOf() const = 0; 200f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl virtual char type_code() const = 0; 201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void PrintData(void* data, FILE* out = stdout) const = 0; 202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const = 0; 203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 204684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_NO_RETURN virtual uint8_t* ToAddress(Debugger* debugger) const { 205684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl USE(debugger); 206684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_ABORT(); 207684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl } 208684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl 209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static Token* Tokenize(const char* arg); 210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static FormatToken* Cast(Token* tok) { 211b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(tok->IsFormat()); 212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return reinterpret_cast<FormatToken*>(tok); 213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 2170f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixltemplate <typename T> 2180f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlclass Format : public FormatToken { 219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 220f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Format(const char* fmt, char type_code) : fmt_(fmt), type_code_(type_code) {} 221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual int SizeOf() const { return sizeof(T); } 223f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl virtual char type_code() const { return type_code_; } 224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void PrintData(void* data, FILE* out = stdout) const { 225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl T value; 226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl memcpy(&value, data, sizeof(value)); 227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, fmt_, value); 228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const; 230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* fmt_; 233f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl char type_code_; 234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Tokens which don't fit any of the above. 237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass UnknownToken : public Token { 238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit UnknownToken(const char* arg) { 240db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl size_t size = strlen(arg) + 1; 241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl unknown_ = new char[size]; 242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl strncpy(unknown_, arg, size); 243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~UnknownToken() { delete[] unknown_; } 245684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_NO_RETURN virtual uint8_t* ToAddress(Debugger* debugger) const { 246684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl USE(debugger); 247684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl VIXL_ABORT(); 248684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl } 249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool IsUnknown() const { return true; } 251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout) const; 252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* unknown_; 255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// All debugger commands must subclass DebugCommand and implement Run, Print 259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// and Build. Commands must also define kHelp and kAliases. 260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass DebugCommand { 261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit DebugCommand(Token* name) : name_(IdentifierToken::Cast(name)) {} 263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl DebugCommand() : name_(NULL) {} 264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~DebugCommand() { delete name_; } 265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* name() { return name_->value(); } 267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Run the command on the given debugger. The command returns true if 268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // execution should move to the next instruction. 2690f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl virtual bool Run(Debugger* debugger) = 0; 270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout); 271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static bool Match(const char* name, const char** aliases); 273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Parse(char* line); 274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static void PrintHelp(const char** aliases, 275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* args, 276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* help); 277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl IdentifierToken* name_; 280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// For all commands below see their respective kHelp and kAliases in 283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// debugger-a64.cc 284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass HelpCommand : public DebugCommand { 285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit HelpCommand(Token* name) : DebugCommand(name) {} 287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass ContinueCommand : public DebugCommand { 299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit ContinueCommand(Token* name) : DebugCommand(name) {} 301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass StepCommand : public DebugCommand { 313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl StepCommand(Token* name, IntegerToken* count) 315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl : DebugCommand(name), count_(count) {} 316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~StepCommand() { delete count_; } 317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int64_t count() { return count_->value(); } 319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout); 321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl IntegerToken* count_; 330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass DisasmCommand : public DebugCommand { 333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass PrintCommand : public DebugCommand { 343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 344f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl PrintCommand(Token* name, Token* target, FormatToken* format) 345f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl : DebugCommand(name), target_(target), format_(format) {} 346f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl virtual ~PrintCommand() { 347f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl delete target_; 348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl delete format_; 349f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* target() { return target_; } 352f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format() { return format_; } 353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout); 355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* target_; 364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format_; 365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlclass ExamineCommand : public DebugCommand { 368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 369f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl ExamineCommand(Token* name, 370f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Token* target, 371f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format, 372f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl IntegerToken* count) 373f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl : DebugCommand(name), target_(target), format_(format), count_(count) {} 374f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl virtual ~ExamineCommand() { 375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl delete target_; 376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl delete format_; 377f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl delete count_; 378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* target() { return target_; } 381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl FormatToken* format() { return format_; } 382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl IntegerToken* count() { return count_; } 383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual void Print(FILE* out = stdout); 385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static DebugCommand* Build(std::vector<Token*> args); 387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kHelp; 389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kAliases[]; 390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl static const char* kArguments; 391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* target_; 394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl FormatToken* format_; 395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl IntegerToken* count_; 396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Commands which name does not match any of the known commnand. 399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass UnknownCommand : public DebugCommand { 400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl explicit UnknownCommand(std::vector<Token*> args) : args_(args) {} 402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~UnknownCommand(); 403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl std::vector<Token*> args_; 408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Commands which name match a known command but the syntax is invalid. 411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlclass InvalidCommand : public DebugCommand { 412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl public: 413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl InvalidCommand(std::vector<Token*> args, int index, const char* cause) 414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl : args_(args), index_(index), cause_(cause) {} 415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual ~InvalidCommand(); 416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl virtual bool Run(Debugger* debugger); 418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl private: 420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl std::vector<Token*> args_; 421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int index_; 422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* cause_; 423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}; 424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 4250f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* HelpCommand::kAliases[] = {"help", NULL}; 426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* HelpCommand::kArguments = NULL; 427f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* HelpCommand::kHelp = " Print this help."; 428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 4290f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* ContinueCommand::kAliases[] = {"continue", "c", NULL}; 430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* ContinueCommand::kArguments = NULL; 431f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* ContinueCommand::kHelp = " Resume execution."; 432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 4330f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* StepCommand::kAliases[] = {"stepi", "si", NULL}; 434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* StepCommand::kArguments = "[n = 1]"; 435f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* StepCommand::kHelp = " Execute n next instruction(s)."; 436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 4370f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* DisasmCommand::kAliases[] = {"disasm", "di", NULL}; 438f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* DisasmCommand::kArguments = "[n = 10]"; 439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* DisasmCommand::kHelp = 4400f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " Disassemble n instruction(s) at pc.\n" 4410f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " This command is equivalent to x pc.i [n = 10]."; 442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 4430f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* PrintCommand::kAliases[] = {"print", "p", NULL}; 4440f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* PrintCommand::kArguments = "<entity>[.format]"; 445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* PrintCommand::kHelp = 4460f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " Print the given entity according to the given format.\n" 4470f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " The format parameter only affects individual registers; it is ignored\n" 4480f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " for other entities.\n" 4490f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " <entity> can be one of the following:\n" 4500f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " * A register name (such as x0, s1, ...).\n" 4510f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " * 'regs', to print all integer (W and X) registers.\n" 4520f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " * 'fpregs' to print all floating-point (S and D) registers.\n" 4530f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " * 'sysregs' to print all system registers (including NZCV).\n" 4540f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " * 'pc' to print the current program counter.\n"; 4550f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl 4560f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* ExamineCommand::kAliases[] = {"m", "mem", "x", NULL}; 457f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* ExamineCommand::kArguments = "<addr>[.format] [n = 10]"; 458f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlconst char* ExamineCommand::kHelp = 4590f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " Examine memory. Print n items of memory at address <addr> according to\n" 4600f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " the given [.format].\n" 4610f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " Addr can be an immediate address, a register name or pc.\n" 4620f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " Format is made of a type letter: 'x' (hexadecimal), 's' (signed), 'u'\n" 4630f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " (unsigned), 'f' (floating point), i (instruction) and a size in bits\n" 4640f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " when appropriate (8, 16, 32, 64)\n" 4650f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " E.g 'x sp.x64' will print 10 64-bit words from the stack in\n" 4660f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl " hexadecimal format."; 4670f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl 4680f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* RegisterToken::kXAliases[kNumberOfRegisters][kMaxAliasNumber] = 4690f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {{"x0", NULL}, 4700f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x1", NULL}, 4710f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x2", NULL}, 4720f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x3", NULL}, 4730f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x4", NULL}, 4740f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x5", NULL}, 4750f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x6", NULL}, 4760f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x7", NULL}, 4770f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x8", NULL}, 4780f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x9", NULL}, 4790f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x10", NULL}, 4800f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x11", NULL}, 4810f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x12", NULL}, 4820f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x13", NULL}, 4830f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x14", NULL}, 4840f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x15", NULL}, 4850f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"ip0", "x16", NULL}, 4860f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"ip1", "x17", NULL}, 4870f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x18", "pr", NULL}, 4880f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x19", NULL}, 4890f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x20", NULL}, 4900f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x21", NULL}, 4910f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x22", NULL}, 4920f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x23", NULL}, 4930f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x24", NULL}, 4940f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x25", NULL}, 4950f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x26", NULL}, 4960f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x27", NULL}, 4970f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"x28", NULL}, 4980f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"fp", "x29", NULL}, 4990f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"lr", "x30", NULL}, 5000f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"sp", NULL}}; 5010f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl 5020f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlconst char* RegisterToken::kWAliases[kNumberOfRegisters][kMaxAliasNumber] = 5030f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {{"w0", NULL}, 5040f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w1", NULL}, 5050f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w2", NULL}, 5060f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w3", NULL}, 5070f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w4", NULL}, 5080f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w5", NULL}, 5090f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w6", NULL}, 5100f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w7", NULL}, 5110f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w8", NULL}, 5120f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w9", NULL}, 5130f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w10", NULL}, 5140f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w11", NULL}, 5150f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w12", NULL}, 5160f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w13", NULL}, 5170f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w14", NULL}, 5180f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w15", NULL}, 5190f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w16", NULL}, 5200f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w17", NULL}, 5210f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w18", NULL}, 5220f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w19", NULL}, 5230f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w20", NULL}, 5240f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w21", NULL}, 5250f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w22", NULL}, 5260f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w23", NULL}, 5270f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w24", NULL}, 5280f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w25", NULL}, 5290f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w26", NULL}, 5300f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w27", NULL}, 5310f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w28", NULL}, 5320f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w29", NULL}, 5330f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"w30", NULL}, 5340f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl {"wsp", NULL}}; 535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugger::Debugger(Decoder* decoder, FILE* stream) 538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl : Simulator(decoder, stream), 539330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl debug_parameters_(DBG_INACTIVE), 540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl pending_request_(false), 541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl steps_(0), 542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl last_command_(NULL) { 543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl disasm_ = new PrintDisassembler(stdout); 544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printer_ = new Decoder(); 545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printer_->AppendVisitor(disasm_); 546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 548db6443499376478f5281607a3923e6ffc4c8d8ecarmvixlDebugger::~Debugger() { 549db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl delete disasm_; 550db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl delete printer_; 551db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl} 552db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl 553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid Debugger::Run() { 5550f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl // Flush any written registers before executing anything, so that 5560f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl // manually-set registers are logged _before_ the first instruction. 5570f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl LogAllWrittenRegisters(); 5580f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl 559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl while (pc_ != kEndOfSimAddress) { 56088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois if (HasPendingRequest()) RunDebuggerShell(); 561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl ExecuteInstruction(); 562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 566c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Debugger::PrintInstructions(const void* address, int64_t count) { 567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (count == 0) { 568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return; 569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 571c68cb64496485710cdb5b8480f8fee287058c93farmvixl const Instruction* from = Instruction::CastConst(address); 572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (count < 0) { 573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl count = -count; 574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl from -= (count - 1) * kInstructionSize; 575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 576c68cb64496485710cdb5b8480f8fee287058c93farmvixl const Instruction* to = from + count * kInstructionSize; 577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 5780f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl for (const Instruction* current = from; current < to; 57988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois current = current->GetNextInstruction()) { 580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printer_->Decode(current); 581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid Debugger::PrintMemory(const uint8_t* address, 586f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const FormatToken* format, 587f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl int64_t count) { 588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (count == 0) { 589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return; 590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const uint8_t* from = address; 593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int size = format->SizeOf(); 594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (count < 0) { 595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl count = -count; 596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl from -= (count - 1) * size; 597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const uint8_t* to = from + count * size; 599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (const uint8_t* current = from; current < to; current += size) { 601f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (((current - from) % 8) == 0) { 6020f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl printf("\n%p: ", reinterpret_cast<const void*>(current)); 603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 6055289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl uint64_t data = Memory::Read<uint64_t>(current); 606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl format->PrintData(&data); 607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" "); 608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("\n\n"); 610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 613f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlvoid Debugger::PrintRegister(const Register& target_reg, 614f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const char* name, 615f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const FormatToken* format) { 61688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const uint64_t reg_size = target_reg.GetSizeInBits(); 617f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t format_size = format->SizeOf() * 8; 618f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t count = reg_size / format_size; 619f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t mask = 0xffffffffffffffff >> (64 - format_size); 6200f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl const uint64_t reg_value = 62188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois ReadRegister<uint64_t>(target_reg.GetCode(), Reg31IsStackPointer); 622b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(count > 0); 623f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 624f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf("%s = ", name); 625f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl for (uint64_t i = 1; i <= count; i++) { 626f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl uint64_t data = reg_value >> (reg_size - (i * format_size)); 627f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl data &= mask; 628f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format->PrintData(&data); 629f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf(" "); 630f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 631f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf("\n"); 632f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl} 633f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 634f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 6355289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl// TODO(all): fix this for vector registers. 636f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlvoid Debugger::PrintFPRegister(const FPRegister& target_fpreg, 637f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const FormatToken* format) { 63888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const unsigned fpreg_size = target_fpreg.GetSizeInBits(); 639f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t format_size = format->SizeOf() * 8; 640f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t count = fpreg_size / format_size; 641f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl const uint64_t mask = 0xffffffffffffffff >> (64 - format_size); 64288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const uint64_t fpreg_value = 64388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois ReadVRegister<uint64_t>(fpreg_size, target_fpreg.GetCode()); 644b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(count > 0); 645f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 646f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (target_fpreg.Is32Bits()) { 64788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("s%u = ", target_fpreg.GetCode()); 648f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else { 64988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("d%u = ", target_fpreg.GetCode()); 650f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 651f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl for (uint64_t i = 1; i <= count; i++) { 652f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl uint64_t data = fpreg_value >> (fpreg_size - (i * format_size)); 653f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl data &= mask; 654f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format->PrintData(&data); 655f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf(" "); 656f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 657f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf("\n"); 658f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl} 659f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 660f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 661c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Debugger::VisitException(const Instruction* instr) { 662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (instr->Mask(ExceptionMask)) { 663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case BRK: 664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl DoBreakpoint(instr); 665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return; 6666e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl case HLT: 6676e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl VIXL_FALLTHROUGH(); 6680f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 6690f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl Simulator::VisitException(instr); 670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Read a command. A command will be at most kMaxDebugShellLine char long and 675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// ends with '\n\0'. 676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// TODO: Should this be a utility function? 677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlchar* Debugger::ReadCommandLine(const char* prompt, char* buffer, int length) { 678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int fgets_calls = 0; 679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* end = NULL; 680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("%s", prompt); 682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fflush(stdout); 683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl do { 685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (fgets(buffer, length, stdin) == NULL) { 686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** Error while reading command. **\n"); 687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fgets_calls++; 691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl end = strchr(buffer, '\n'); 692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } while (end == NULL); 693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (fgets_calls != 1) { 695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** Command too long. **\n"); 696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Remove the newline from the end of the command. 700b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(end[1] == '\0'); 701b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT((end - buffer) < (length - 1)); 702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl end[0] = '\0'; 703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return buffer; 705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid Debugger::RunDebuggerShell() { 709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (IsDebuggerRunning()) { 710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (steps_ > 0) { 711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Finish stepping first. 712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl --steps_; 713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return; 714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("Next: "); 71788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois PrintInstructions(ReadPc()); 718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl bool done = false; 719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl while (!done) { 720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char buffer[kMaxDebugShellLine]; 721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* line = ReadCommandLine("vixl> ", buffer, kMaxDebugShellLine); 722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (line == NULL) continue; // An error occurred. 724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl DebugCommand* command = DebugCommand::Parse(line); 726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (command != NULL) { 727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl last_command_ = command; 728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (last_command_ != NULL) { 731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl done = last_command_->Run(this); 732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("No previous command to run!\n"); 734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if ((debug_parameters_ & DBG_BREAK) != 0) { 738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // The break request has now been handled, move to next instruction. 739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl debug_parameters_ &= ~DBG_BREAK; 74088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois IncrementPc(); 741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 746c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Debugger::DoBreakpoint(const Instruction* instr) { 747b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(instr->Mask(ExceptionMask) == BRK); 748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 749c68cb64496485710cdb5b8480f8fee287058c93farmvixl printf("Hit breakpoint at pc=%p.\n", reinterpret_cast<const void*>(instr)); 75088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois SetDebugParameters(GetDebugParameters() | DBG_BREAK | DBG_ACTIVE); 751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Make the shell point to the brk instruction. 75288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois WritePc(instr); 753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic bool StringToUInt64(uint64_t* value, const char* line, int base = 10) { 757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* endptr = NULL; 758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl errno = 0; // Reset errors. 759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint64_t parsed = strtoul(line, &endptr, base); 760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (errno == ERANGE) { 762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Overflow. 763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (endptr == line) { 767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // No digits were parsed. 768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (*endptr != '\0') { 772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Non-digit characters present at the end. 773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl *value = parsed; 777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return true; 778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic bool StringToInt64(int64_t* value, const char* line, int base = 10) { 782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* endptr = NULL; 783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl errno = 0; // Reset errors. 784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int64_t parsed = strtol(line, &endptr, base); 785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (errno == ERANGE) { 787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Overflow, undeflow. 788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (endptr == line) { 792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // No digits were parsed. 793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (*endptr != '\0') { 797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Non-digit characters present at the end. 798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl *value = parsed; 802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return true; 803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* Token::Tokenize(const char* arg) { 807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if ((arg == NULL) || (*arg == '\0')) { 808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // The order is important. For example Identifier::Tokenize would consider 812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // any register to be a valid identifier. 813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* token = RegisterToken::Tokenize(arg); 815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (token != NULL) { 816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return token; 817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl token = FPRegisterToken::Tokenize(arg); 820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (token != NULL) { 821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return token; 822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl token = IdentifierToken::Tokenize(arg); 825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (token != NULL) { 826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return token; 827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl token = AddressToken::Tokenize(arg); 830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (token != NULL) { 831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return token; 832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl token = IntegerToken::Tokenize(arg); 835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (token != NULL) { 836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return token; 837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new UnknownToken(arg); 840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixluint8_t* RegisterToken::ToAddress(Debugger* debugger) const { 844b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(CanAddressMemory()); 84588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint64_t reg_value = 84688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois debugger->ReadXRegister(value().GetCode(), Reg31IsStackPointer); 847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint8_t* address = NULL; 848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl memcpy(&address, ®_value, sizeof(address)); 849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return address; 850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid RegisterToken::Print(FILE* out) const { 854b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(value().IsValid()); 855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "[Register %s]", Name()); 856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlconst char* RegisterToken::Name() const { 860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (value().Is32Bits()) { 86188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois return kWAliases[value().GetCode()][0]; 862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 86388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois return kXAliases[value().GetCode()][0]; 864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* RegisterToken::Tokenize(const char* arg) { 869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (unsigned i = 0; i < kNumberOfRegisters; i++) { 870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Is it a X register or alias? 871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (const char** current = kXAliases[i]; *current != NULL; current++) { 872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (strcmp(arg, *current) == 0) { 87388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois return new RegisterToken(Register::GetXRegFromCode(i)); 874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl // Is it a W register or alias? 878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (const char** current = kWAliases[i]; *current != NULL; current++) { 879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (strcmp(arg, *current) == 0) { 88088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois return new RegisterToken(Register::GetWRegFromCode(i)); 881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid FPRegisterToken::Print(FILE* out) const { 890b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(value().IsValid()); 891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char prefix = value().Is32Bits() ? 's' : 'd'; 89288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois fprintf(out, "[FPRegister %c%" PRIu32 "]", prefix, value().GetCode()); 893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* FPRegisterToken::Tokenize(const char* arg) { 897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (strlen(arg) < 2) { 898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (*arg) { 902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 's': 903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 'd': 904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* cursor = arg + 1; 905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint64_t code = 0; 906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!StringToUInt64(&code, cursor)) { 907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (code > kNumberOfFPRegisters) { 911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 9145289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl VRegister fpreg = NoVReg; 915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (*arg) { 916db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl case 's': 91788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois fpreg = VRegister::GetSRegFromCode(static_cast<unsigned>(code)); 918db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl break; 919db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl case 'd': 92088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois fpreg = VRegister::GetDRegFromCode(static_cast<unsigned>(code)); 921db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl break; 9220f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 9230f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl VIXL_UNREACHABLE(); 924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new FPRegisterToken(fpreg); 927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixluint8_t* IdentifierToken::ToAddress(Debugger* debugger) const { 934b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(CanAddressMemory()); 93588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const Instruction* pc_value = debugger->ReadPc(); 936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint8_t* address = NULL; 937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl memcpy(&address, &pc_value, sizeof(address)); 938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return address; 939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid IdentifierToken::Print(FILE* out) const { 942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "[Identifier %s]", value()); 943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* IdentifierToken::Tokenize(const char* arg) { 947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!isalpha(arg[0])) { 948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* cursor = arg + 1; 952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl while ((*cursor != '\0') && isalnum(*cursor)) { 953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl ++cursor; 954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (*cursor == '\0') { 957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new IdentifierToken(arg); 958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixluint8_t* AddressToken::ToAddress(Debugger* debugger) const { 965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl USE(debugger); 966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return value(); 967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid AddressToken::Print(FILE* out) const { 9710f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl fprintf(out, "[Address %p]", reinterpret_cast<const void*>(value())); 972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* AddressToken::Tokenize(const char* arg) { 976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if ((strlen(arg) < 3) || (arg[0] != '0') || (arg[1] != 'x')) { 977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint64_t ptr = 0; 981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!StringToUInt64(&ptr, arg, 16)) { 982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint8_t* address = reinterpret_cast<uint8_t*>(ptr); 986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new AddressToken(address); 987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid IntegerToken::Print(FILE* out) const { 991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "[Integer %" PRId64 "]", value()); 992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* IntegerToken::Tokenize(const char* arg) { 996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int64_t value = 0; 997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!StringToInt64(&value, arg)) { 998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new IntegerToken(value); 1002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlToken* FormatToken::Tokenize(const char* arg) { 1006db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl size_t length = strlen(arg); 1007f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (arg[0]) { 1008f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'x': 1009f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 's': 1010f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'u': 1011f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'f': 1012f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (length == 1) return NULL; 1013f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl break; 1014f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'i': 1015f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (length == 1) return new Format<uint32_t>("%08" PRIx32, 'i'); 10166e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl VIXL_FALLTHROUGH(); 10170f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 10180f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return NULL; 1019f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1020f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1021f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl char* endptr = NULL; 1022f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl errno = 0; // Reset errors. 1023f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl uint64_t count = strtoul(arg + 1, &endptr, 10); 1024f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1025f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (errno != 0) { 1026f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // Overflow, etc. 1027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 1028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1030f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (endptr == arg) { 1031f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // No digits were parsed. 1032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 1033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1035f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (*endptr != '\0') { 1036f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // There are unexpected (non-digit) characters after the number. 1037f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return NULL; 1038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1040f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (arg[0]) { 1041f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'x': 1042f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (count) { 10430f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 8: 10440f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint8_t>("%02" PRIx8, 'x'); 10450f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 16: 10460f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint16_t>("%04" PRIx16, 'x'); 10470f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 32: 10480f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint32_t>("%08" PRIx32, 'x'); 10490f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 64: 10500f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint64_t>("%016" PRIx64, 'x'); 10510f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 10520f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return NULL; 1053f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 's': 1055f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (count) { 10560f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 8: 10570f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<int8_t>("%4" PRId8, 's'); 10580f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 16: 10590f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<int16_t>("%6" PRId16, 's'); 10600f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 32: 10610f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<int32_t>("%11" PRId32, 's'); 10620f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 64: 10630f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<int64_t>("%20" PRId64, 's'); 10640f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 10650f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return NULL; 1066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 'u': 1068f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (count) { 10690f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 8: 10700f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint8_t>("%3" PRIu8, 'u'); 10710f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 16: 10720f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint16_t>("%5" PRIu16, 'u'); 10730f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 32: 10740f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint32_t>("%10" PRIu32, 'u'); 10750f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 64: 10760f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<uint64_t>("%20" PRIu64, 'u'); 10770f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 10780f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return NULL; 1079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1080f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 'f': 1081f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (count) { 10820f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 32: 10830f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<float>("%13g", 'f'); 10840f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 64: 10850f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new Format<double>("%13g", 'f'); 10860f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 10870f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return NULL; 1088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl default: 1090b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_UNREACHABLE(); 1091f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return NULL; 1092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 10960f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixltemplate <typename T> 1097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid Format<T>::Print(FILE* out) const { 1098b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl unsigned size = sizeof(T) * 8; 1099b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl fprintf(out, "[Format %c%u - %s]", type_code_, size, fmt_); 1100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid UnknownToken::Print(FILE* out) const { 1104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "[Unknown %s]", unknown_); 1105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 11080f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlvoid DebugCommand::Print(FILE* out) { fprintf(out, "%s", name()); } 1109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool DebugCommand::Match(const char* name, const char** aliases) { 1112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (const char** current = aliases; *current != NULL; current++) { 1113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (strcmp(name, *current) == 0) { 11140f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return true; 1115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* DebugCommand::Parse(char* line) { 1123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl std::vector<Token*> args; 1124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 11250f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl for (char* chunk = strtok(line, " \t"); chunk != NULL; 1126f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl chunk = strtok(NULL, " \t")) { 1127f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl char* dot = strchr(chunk, '.'); 1128f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (dot != NULL) { 1129f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // 'Token.format'. 1130f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Token* format = FormatToken::Tokenize(dot + 1); 1131f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (format != NULL) { 1132f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl *dot = '\0'; 1133f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl args.push_back(Token::Tokenize(chunk)); 1134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl args.push_back(format); 1135f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else { 1136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // Error while parsing the format, push the UnknownToken so an error 1137f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // can be accurately reported. 1138f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl args.push_back(Token::Tokenize(chunk)); 1139f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1140f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else { 1141f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl args.push_back(Token::Tokenize(chunk)); 1142f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (args.size() == 0) { 1146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return NULL; 1147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!args[0]->IsIdentifier()) { 1150f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 0, "command name is not valid"); 1151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* name = IdentifierToken::Cast(args[0])->value(); 11540f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl#define RETURN_IF_MATCH(Command) \ 11550f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl if (Match(name, Command::kAliases)) { \ 11560f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return Command::Build(args); \ 1157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl DEBUG_COMMAND_LIST(RETURN_IF_MATCH); 11590f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl#undef RETURN_IF_MATCH 1160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new UnknownCommand(args); 1162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid DebugCommand::PrintHelp(const char** aliases, 1166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* args, 1167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl const char* help) { 1168b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(aliases[0] != NULL); 1169b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(help != NULL); 1170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("\n----\n\n"); 1172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl for (const char** current = aliases; *current != NULL; current++) { 1173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (args != NULL) { 1174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("%s %s\n", *current, args); 1175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 1176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("%s\n", *current); 1177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("\n%s\n", help); 1180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool HelpCommand::Run(Debugger* debugger) { 1184b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl USE(debugger); 1186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 11870f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl#define PRINT_HELP(Command) \ 11880f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl DebugCommand::PrintHelp(Command::kAliases, \ 11890f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl Command::kArguments, \ 11900f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl Command::kHelp); 1191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl DEBUG_COMMAND_LIST(PRINT_HELP); 11920f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl#undef PRINT_HELP 1193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("\n----\n\n"); 1194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* HelpCommand::Build(std::vector<Token*> args) { 1200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (args.size() != 1) { 1201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new HelpCommand(args[0]); 1205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool ContinueCommand::Run(Debugger* debugger) { 1209b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 121188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois debugger->SetDebugParameters(debugger->GetDebugParameters() & ~DBG_ACTIVE); 1212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return true; 1213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* ContinueCommand::Build(std::vector<Token*> args) { 1217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (args.size() != 1) { 1218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new ContinueCommand(args[0]); 1222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool StepCommand::Run(Debugger* debugger) { 1226b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl int64_t steps = count(); 1229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (steps < 0) { 1230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** invalid value for steps: %" PRId64 " (<0) **\n", steps); 1231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else if (steps > 1) { 123288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois debugger->SetSteps(steps - 1); 1233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return true; 1236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid StepCommand::Print(FILE* out) { 1240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "%s %" PRId64 "", name(), count()); 1241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* StepCommand::Build(std::vector<Token*> args) { 1245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl IntegerToken* count = NULL; 1246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (args.size()) { 1247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 1: { // step [1] 1248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl count = new IntegerToken(1); 1249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 2: { // step n 1252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* first = args[1]; 1253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!first->IsInteger()) { 1254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, 1, "expects int"); 1255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl count = IntegerToken::Cast(first); 1257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl default: 1260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new StepCommand(args[0], count); 1264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* DisasmCommand::Build(std::vector<Token*> args) { 1268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl IntegerToken* count = NULL; 1269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (args.size()) { 1270f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 1: { // disasm [10] 1271f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = new IntegerToken(10); 1272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1274f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 2: { // disasm n 1275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* first = args[1]; 1276f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (!first->IsInteger()) { 1277f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 1, "expects int"); 1278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1279f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1280f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = IntegerToken::Cast(first); 1281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl default: 1284f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1287f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Token* target = new IdentifierToken("pc"); 1288f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format = new Format<uint32_t>("%08" PRIx32, 'i'); 1289f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new ExamineCommand(args[0], target, format, count); 1290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlvoid PrintCommand::Print(FILE* out) { 1294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "%s ", name()); 1295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl target()->Print(out); 1296f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (format() != NULL) format()->Print(out); 1297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool PrintCommand::Run(Debugger* debugger) { 1301b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* tok = target(); 1304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (tok->IsIdentifier()) { 1305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl char* identifier = IdentifierToken::Cast(tok)->value(); 1306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (strcmp(identifier, "regs") == 0) { 1307330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl debugger->PrintRegisters(); 1308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else if (strcmp(identifier, "fpregs") == 0) { 13095289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl debugger->PrintVRegisters(); 1310578645f14e122d2b87d907e298cda7e7d0babf1farmvixl } else if (strcmp(identifier, "sysregs") == 0) { 1311330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl debugger->PrintSystemRegisters(); 1312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else if (strcmp(identifier, "pc") == 0) { 131388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("pc = %16p\n", reinterpret_cast<const void*>(debugger->ReadPc())); 1314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 1315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** Unknown identifier to print: %s **\n", identifier); 1316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1321f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format_tok = format(); 1322b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(format_tok != NULL); 1323f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (format_tok->type_code() == 'i') { 1324f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // TODO(all): Add support for instruction disassembly. 1325f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl printf(" ** unsupported format: instructions **\n"); 1326f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return false; 1327f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1328f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (tok->IsRegister()) { 1330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl RegisterToken* reg_tok = RegisterToken::Cast(tok); 1331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Register reg = reg_tok->value(); 1332f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl debugger->PrintRegister(reg, reg_tok->Name(), format_tok); 1333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (tok->IsFPRegister()) { 1337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl FPRegister fpreg = FPRegisterToken::Cast(tok)->value(); 1338f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl debugger->PrintFPRegister(fpreg, format_tok); 1339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1342b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_UNREACHABLE(); 1343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlDebugCommand* PrintCommand::Build(std::vector<Token*> args) { 1348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (args.size() < 2) { 1349f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, -1, "too few arguments"); 1350f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1351f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1352f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Token* target = args[1]; 13530f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl if (!target->IsRegister() && !target->IsFPRegister() && 1354f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl !target->IsIdentifier()) { 1355f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 1, "expects reg or identifier"); 1356f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1357f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1358f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format = NULL; 1359f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl int target_size = 0; 1360f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (target->IsRegister()) { 1361f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Register reg = RegisterToken::Cast(target)->value(); 136288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois target_size = reg.GetSizeInBytes(); 1363f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else if (target->IsFPRegister()) { 1364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FPRegister fpreg = FPRegisterToken::Cast(target)->value(); 136588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois target_size = fpreg.GetSizeInBytes(); 1366f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // If the target is an identifier there must be no format. This is checked 1368f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // in the switch statement below. 1369f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (args.size()) { 1371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl case 2: { 1372f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (target->IsRegister()) { 1373f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (target_size) { 13740f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 4: 13750f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl format = new Format<uint32_t>("%08" PRIx32, 'x'); 13760f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl break; 13770f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 8: 13780f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl format = new Format<uint64_t>("%016" PRIx64, 'x'); 13790f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl break; 13800f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 13810f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl VIXL_UNREACHABLE(); 1382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1383f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else if (target->IsFPRegister()) { 1384f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl switch (target_size) { 13850f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 4: 13860f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl format = new Format<float>("%8g", 'f'); 13870f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl break; 13880f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl case 8: 13890f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl format = new Format<double>("%8g", 'f'); 13900f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl break; 13910f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl default: 13920f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl VIXL_UNREACHABLE(); 1393f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1397f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 3: { 1398f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (target->IsIdentifier()) { 13990f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl return new InvalidCommand(args, 14000f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl 2, 14010f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl "format is only allowed with registers"); 1402f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1403f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1404f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl Token* second = args[2]; 1405f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (!second->IsFormat()) { 1406f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 2, "expects format"); 1407f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1408f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format = FormatToken::Cast(second); 1409f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1410f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (format->SizeOf() > target_size) { 1411f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 2, "format too wide"); 1412f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1413f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1414f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl break; 1415f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl default: 1417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1420f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new PrintCommand(args[0], target, format); 1421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1424f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlbool ExamineCommand::Run(Debugger* debugger) { 1425b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl uint8_t* address = target()->ToAddress(debugger); 14280f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl int64_t amount = count()->value(); 1429f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (format()->type_code() == 'i') { 1430f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl debugger->PrintInstructions(address, amount); 1431f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else { 1432f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl debugger->PrintMemory(address, format(), amount); 1433f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } 1434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlvoid ExamineCommand::Print(FILE* out) { 1440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl fprintf(out, "%s ", name()); 1441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl format()->Print(out); 1442f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl target()->Print(out); 1443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1446f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlDebugCommand* ExamineCommand::Build(std::vector<Token*> args) { 1447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (args.size() < 2) { 1448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too few arguments"); 1449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* target = args[1]; 1452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl if (!target->CanAddressMemory()) { 1453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, 1, "expects address"); 1454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1456f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl FormatToken* format = NULL; 1457f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl IntegerToken* count = NULL; 1458f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl 1459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl switch (args.size()) { 1460f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 2: { // mem addr[.x64] [10] 1461f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format = new Format<uint64_t>("%016" PRIx64, 'x'); 1462f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = new IntegerToken(10); 1463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1465f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 3: { // mem addr.format [10] 1466f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl // mem addr[.x64] n 1467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* second = args[2]; 1468f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (second->IsFormat()) { 1469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl format = FormatToken::Cast(second); 1470f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = new IntegerToken(10); 1471f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl break; 1472f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl } else if (second->IsInteger()) { 1473f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format = new Format<uint64_t>("%016" PRIx64, 'x'); 1474f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = IntegerToken::Cast(second); 1475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 1476f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, 2, "expects format or integer"); 1477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1478b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_UNREACHABLE(); 1479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1481f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl case 4: { // mem addr.format n 1482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* second = args[2]; 1483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl Token* third = args[3]; 1484f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl if (!second->IsFormat() || !third->IsInteger()) { 1485f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new InvalidCommand(args, -1, "expects addr[.format] [n]"); 1486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1487f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl format = FormatToken::Cast(second); 1488f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl count = IntegerToken::Cast(third); 1489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl break; 1490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl default: 1492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return new InvalidCommand(args, -1, "too many arguments"); 1493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1495f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl return new ExamineCommand(args[0], target, format, count); 1496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlUnknownCommand::~UnknownCommand() { 1500db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl const size_t size = args_.size(); 1501db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl for (size_t i = 0; i < size; ++i) { 1502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl delete args_[i]; 1503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool UnknownCommand::Run(Debugger* debugger) { 1508b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl USE(debugger); 1510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** Unknown Command:"); 1512db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl const size_t size = args_.size(); 1513db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl for (size_t i = 0; i < size; ++i) { 1514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" "); 1515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl args_[i]->Print(stdout); 1516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" **\n"); 1518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlInvalidCommand::~InvalidCommand() { 1524db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl const size_t size = args_.size(); 1525db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl for (size_t i = 0; i < size; ++i) { 1526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl delete args_[i]; 1527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlbool InvalidCommand::Run(Debugger* debugger) { 1532b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl VIXL_ASSERT(debugger->IsDebuggerRunning()); 1533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl USE(debugger); 1534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** Invalid Command:"); 1536db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl const size_t size = args_.size(); 1537db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl for (size_t i = 0; i < size; ++i) { 1538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" "); 1539db6443499376478f5281607a3923e6ffc4c8d8ecarmvixl if (i == static_cast<size_t>(index_)) { 1540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(">>"); 1541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl args_[i]->Print(stdout); 1542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf("<<"); 1543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } else { 1544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl args_[i]->Print(stdout); 1545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl } 1547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" **\n"); 1548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl printf(" ** %s\n", cause_); 1549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 1550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl return false; 1551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} 1552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl 155388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois} // namespace aarch64 1554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl} // namespace vixl 1555b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl 1556684cd2a7f5845539b58d0da7e012e39df49ceff0armvixl#endif // VIXL_INCLUDE_SIMULATOR 1557