Arquivos
hhvm/hphp/util/disasm.h
T
bsimmers 3f829f3ede Print relative offsets in Eval.JitCompareHHIR
This diff adds a relativeOffsets option to Disasm, which will print
code addresses as relative offsets from the beginning of the tracelet instead
of absolute addresses. This format makes it much easier to compare the relative
sizes of the instructions selected by the two jits. I also changed the runtime
option to be a double instead of a bool, which is used as the cutoff ratio for
which tracelets to print. Setting it to 1 will print tracelets where the ir
made larger code than tx64, setting it to 2 will print tracelets where the ir's
code is at least twice as big as tx64's, etc...
2013-03-19 14:11:16 -07:00

78 linhas
2.3 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_UTIL_DISAASM_H_
#define incl_UTIL_DISASM_H_
#ifdef HAVE_LIBXED
extern "C" {
#include <xed-interface.h>
}
#endif // HAVE_LIBXED
#include <ostream>
#include <boost/noncopyable.hpp>
namespace HPHP {
class Disasm : private boost::noncopyable {
public:
struct Options {
Options()
: m_indentLevel(0)
, m_printEncoding(false)
, m_relativeOffset(false)
{}
Options& indent(int i) {
m_indentLevel = i;
return *this;
}
Options& printEncoding(bool pe) {
m_printEncoding = pe;
return *this;
}
Options& relativeOffset(bool re) {
m_relativeOffset = re;
return *this;
}
int m_indentLevel;
bool m_printEncoding;
bool m_relativeOffset;
};
/* Create a Disasm object. indentLevel spaces will be put at the beginning of
* each line of disassembly. If printEncoding is true, the raw hex bytes of
* the instructions will also be in the output. */
explicit Disasm(const Options& opts = Options());
/* Disassemble instructions. start should be the first byte of the region to
* disassemble and end should be the first byte past the region to
* disassemble. */
void disasm(std::ostream& out, uint8_t* start, uint8_t* end);
private:
#ifdef HAVE_LIBXED
xed_state_t m_xedState;
#endif // HAVE_LIBXED
const Options m_opts;
};
} // namespace HPHP
#endif