blob: e1309a63fc5ba3231989832eff250daffa4eebeb [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2012-2021 Google, Inc. All rights reserved.
* Copyright (c) 2000-2010 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of VMware, Inc. nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
/* Copyright (c) 2003-2007 Determina Corp. */
/* Copyright (c) 2001-2003 Massachusetts Institute of Technology */
/* Copyright (c) 2000-2001 Hewlett-Packard Company */
#ifndef _DR_TRACEDUMP_H_
#define _DR_TRACEDUMP_H_ 1
/**
* @file dr_tracedump.h
* @brief Binary trace dump format for the -tracedump_binary option.
*/
/****************************************************************************
* BINARY TRACE DUMP FORMAT
*/
/**<pre>
* Binary trace dump format:
* the file starts with a tracedump_file_header_t
* then, for each trace:
struct _tracedump_trace_header
if num_bbs > 0 # tracedump_origins
foreach bb:
app_pc tag;
int bb_code_size;
byte code[bb_code_size];
endif
foreach exit:
struct _tracedump_stub_data
if linkcount_size > 0 # deprecated
linkcount_type_t count; # sizeof == linkcount_size
endif
if separate from body
(i.e., exit_stub < cache_start_pc || exit_stub >= cache_start_pc+code_size):
byte stub_code[15]; # all separate stubs are 15
endif
endfor
byte code[code_size];
</pre>
*/
typedef struct _tracedump_file_header_t {
int version; /**< The DynamoRIO version that created the file. */
bool x64; /**< Whether a 64-bit DynamoRIO library created the file. */
int linkcount_size; /**< Size of the linkcount (linkcounts are deprecated). */
} tracedump_file_header_t;
/** Header for an individual trace in a binary trace dump file. */
typedef struct _tracedump_trace_header_t {
int frag_id; /**< Identifier for the trace. */
app_pc tag; /**< Application address for start of trace. */
app_pc cache_start_pc; /**< Code cache address of start of trace. */
int entry_offs; /**< Offset into trace of normal entry. */
int num_exits; /**< Number of exits from the trace. */
int code_size; /**< Length of the trace in the code cache. */
uint num_bbs; /**< Number of constituent basic blocks making up the trace. */
bool x64; /**< Whether the trace contains 64-bit code. */
} tracedump_trace_header_t;
/** Size of tag + bb_code_size fields for each bb. */
#define BB_ORIGIN_HEADER_SIZE (sizeof(app_pc) + sizeof(int))
/**< tracedump_stub_data_t.stub_size will not exceed this value. */
#define SEPARATE_STUB_MAX_SIZE IF_X64_ELSE(23, 15)
/** The format of a stub in a trace dump file. */
typedef struct _tracedump_stub_data {
int cti_offs; /**< Offset from the start of the fragment. */
/* stub_pc is an absolute address, since can be separate from body. */
app_pc stub_pc; /**< Code cache address of the stub. */
app_pc target; /**< Target of the stub. */
bool linked; /**< Whether the stub is linked to its target. */
int stub_size; /**< Length of stub_code array */
/****** the rest of the fields are optional and may not be present! ******/
union {
uint count32; /**< 32-bit exit execution count. */
uint64 count64; /**< 64-bit exit execution count. */
} count; /**< Which field is present depends on the first entry in
* the file, which indicates the linkcount size. */
/** Code for exit stubs. Only present if:
* stub_pc < cache_start_pc ||
* stub_pc >= cache_start_pc+code_size).
* The actual size of the array varies and is indicated by the stub_size field.
*/
byte stub_code[1 /*variable-sized*/];
} tracedump_stub_data_t;
/** The last offset into tracedump_stub_data_t of always-present fields. */
#define STUB_DATA_FIXED_SIZE (offsetof(tracedump_stub_data_t, count))
#endif /* _DR_TRACEDUMP_H_ */