19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2007-2008 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_DISASM_H_ 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_DISASM_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace disasm { 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef unsigned char byte; 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Interface and default implementation for converting addresses and 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// register-numbers to text. The default implementation is machine 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specific. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass NameConverter { 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~NameConverter() {} 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual const char* NameOfCPURegister(int reg) const; 197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org virtual const char* NameOfByteCPURegister(int reg) const; 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual const char* NameOfXMMRegister(int reg) const; 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual const char* NameOfAddress(byte* addr) const; 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual const char* NameOfConstant(byte* addr) const; 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual const char* NameInCode(byte* addr) const; 24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 25ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org protected: 26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org v8::internal::EmbeddedVector<char, 128> tmp_buffer_; 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A generic Disassembler interface 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Disassembler { 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Caller deallocates converter. 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen explicit Disassembler(const NameConverter& converter); 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~Disassembler(); 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Writes one disassembled instruction into 'buffer' (0-terminated). 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the length of the disassembled machine instruction in bytes. 40b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org int InstructionDecode(v8::internal::Vector<char> buffer, byte* instruction); 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 427276f14ca716596e0a0d17539516370c1f453847kasper.lund // Returns -1 if instruction does not mark the beginning of a constant pool, 437276f14ca716596e0a0d17539516370c1f453847kasper.lund // or the number of entries in the constant pool beginning here. 447276f14ca716596e0a0d17539516370c1f453847kasper.lund int ConstantPoolSizeAt(byte* instruction); 457276f14ca716596e0a0d17539516370c1f453847kasper.lund 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Write disassembly into specified file 'f' using specified NameConverter 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // (see constructor). 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void Disassemble(FILE* f, byte* begin, byte* end); 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const NameConverter& converter_; 513bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 523bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(Disassembler); 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} // namespace disasm 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_DISASM_H_ 58