This patch adds a formal specification of the jitdump format. The goal is
to help jit runtime developers implement the jitdump support without having
to read the jvmti code.

Signed-off-by: Stephane Eranian <eran...@google.com>
---
 tools/perf/Documentation/jitdump-specification.txt | 170 +++++++++++++++++++++
 1 file changed, 170 insertions(+)
 create mode 100644 tools/perf/Documentation/jitdump-specification.txt

diff --git a/tools/perf/Documentation/jitdump-specification.txt 
b/tools/perf/Documentation/jitdump-specification.txt
new file mode 100644
index 000000000000..f32397dbcb29
--- /dev/null
+++ b/tools/perf/Documentation/jitdump-specification.txt
@@ -0,0 +1,170 @@
+JITDUMP specification version 2
+Last Revised: 09/15/2016
+Author: Stephane Eranian <eran...@gmail.com>
+
+--------------------------------------------------------
+| Revision  |    Date    | Description                 |
+--------------------------------------------------------
+|   1       | 09/07/2016 | Initial revision            |
+--------------------------------------------------------
+|   2       | 09/15/2016 | Add JIT_CODE_UNWINDING_INFO |
+--------------------------------------------------------
+
+
+I/ Introduction
+
+
+This document describes the jitdump file format. The file is generated by 
Just-In-time compiler runtimes to save meta-data information about the 
generated code, such as address, size, and name of generated functions, the 
native code generated, the source line information. The data may then be used 
by performance tools, such as Linux perf to generate function and assembly 
level profiles.
+
+The format is not specific to any particular programming language. It can be 
extended as need be.
+
+The format of the file is binary. It is self-describing in terms of endianness 
and is portable across multiple processor architectures.
+
+
+II/ Overview of the format
+
+
+The format requires only sequential accesses, i.e., append only mode. The file 
starts with a fixed size file header describing the version of the 
specification, the endianness.
+
+The header is followed by a series of records, each starting with a fixed size 
header describing the type of record and its size. It is, itself, followed by 
the payload for the record. Records can have a variable size even for a given 
type.
+
+Each entry in the file is timestamped. All timestamps must use the same clock 
source. The CLOCK_MONOTONIC clock source is recommended.
+
+
+III/ Jitdump file header format
+
+Each jitdump file starts with a fixed size header containing the following 
fields in order:
+
+
+* uint32_t magic     : a magic number tagging the file type. The value is 
4-byte long and represents the string "JiTD" in ASCII form. It is 0x4A695444 or 
0x4454694a depending on the endianness. The field can be used to detect the 
endianness of the file
+* uint32_t version   : a 4-byte value representing the format version. It is 
currently set to 2
+* uint32_t total_size: size in bytes of file header
+* uint32_t elf_mach  : ELF architecture encoding (ELF e_machine value as 
specified in /usr/include/elf.h)
+* uint32_t pad1      : padding. Reserved for future use
+* uint32_t pid       : JIT runtime process identification (OS specific)
+* uint64_t timestamp : timestamp of when the file was created
+* uint64_t flags     : a bitmask of flags
+
+The flags currently defined are as follows:
+ * bit 0: JITDUMP_FLAGS_ARCH_TIMESTAMP : set if the jitdump file is using an 
architecture-specific timestamp clock source. For instance, on x86, one could 
use TSC directly
+
+IV/ Record header
+
+The file header is immediately followed by records. Each record starts with a 
fixed size header describing the record that follows.
+
+The record header is specified in order as follows:
+* uint32_t id        : a value identifying the record type (see below)
+* uint32_t total_size: the size in bytes of the record including the header.
+* uint64_t timestamp : a timestamp of when the record was created.
+
+The following record types are defined:
+ * Value 0 : JIT_CODE_LOAD      : record describing a jitted function
+ * Value 1 : JIT_CODE_MOVE      : record describing an already jitted function 
which is moved
+ * Value 2 : JIT_CODE_DEBUG_INFO: record describing the debug information for 
a jitted function
+ * Value 3 : JIT_CODE_CLOSE     : record marking the end of the jit runtime 
(optional)
+ * Value 4 : JIT_CODE_UNWINDING_INFO: record describing a function unwinding 
information
+
+ The payload of the record must immediately follow the record header without 
padding.
+
+V/ JIT_CODE_LOAD record
+
+
+  The record has the following fields following the fixed-size record header 
in order:
+  * uint32_t pid: OS process id of the runtime generating the jitted code
+  * uint32_t tid: OS thread identification of the runtime thread generating 
the jitted code
+  * uint64_t vma: virtual address of jitted code start
+  * uint64_t code_addr: code start address for the jitted code. By default vma 
= code_addr
+  * uint64_t code_size: size in bytes of the generated jitted code
+  * uint64_t code_index: unique identifier for the jitted code (see below)
+  * char[n]: function name in ASCII including the null termination
+  * native code: raw byte encoding of the jitted code
+
+  The record header total_size field is inclusive of all components:
+  * record header
+  * fixed-sized fields
+  * function name string, including termination
+  * native code length
+  * record specific variable data (e.g., array of data entries)
+
+The code_index is used to uniquely identify each jitted function. The index 
can be a monotonically increasing 64-bit value. Each time a function is jitted 
it gets a new number. This value is used in case the code for a function is 
moved and avoids having to issue another JIT_CODE_LOAD record.
+
+The format supports empty functions with no native code.
+
+
+VI/ JIT_CODE_MOVE record
+
+  The record type is optional.
+
+  The record has the following fields following the fixed-size record header 
in order:
+  * uint32_t pid          : OS process id of the runtime generating the jitted 
code
+  * uint32_t tid          : OS thread identification of the runtime thread 
generating the jitted code
+  * uint64_t vma          : new virtual address of jitted code start
+  * uint64_t old_code_addr: previous code address for the same function
+  * uint64_t new_code_addr: alternate new code started address for the jitted 
code. By default it should be equal to the vma address.
+  * uint64_t code_size    : size in bytes of the jitted code
+  * uint64_t code_index   : index referring to the JIT_CODE_LOAD code_index 
record of when the function was initially jitted
+
+
+The MOVE record can be used in case an already jitted function is simply moved 
by the runtime inside the code cache.
+
+The JIT_CODE_MOVE record cannot come before the JIT_CODE_LOAD record for the 
same function name. The function cannot have changed name, otherwise a new 
JIT_CODE_LOAD record must be emitted.
+
+The code size of the function cannot change.
+
+
+VII/ JIT_DEBUG_INFO record
+
+The record type is optional.
+
+The record contains source lines debug information, i.e., a way to map a code 
address back to a source line. This information may be used by the performance 
tool.
+
+The record has the following fields following the fixed-size record header in 
order:
+  * uint64_t code_addr: address of function for which the debug information is 
generated
+  * uint64_t nr_entry : number of debug entries for the function
+  * debug_entry[n]: array of nr_entry debug entries for the function
+
+The debug_entry describes the source line information. It is defined as 
follows in order:
+* uint64_t code_addr: address of function for which the debug information is 
generated
+* uint32_t line     : source file line number (starting at 1)
+* uint32_t discrim  : column discriminator, 0 is default
+* char name[n]      : source file name in ASCII, including null termination
+
+The debug_entry entries are saved in sequence but given that they have 
variable sizes due to the file name string, they cannot be indexed directly.
+They need to be walked sequentially. The next debug_entry is found at 
sizeof(debug_entry) + strlen(name) + 1.
+
+IMPORTANT:
+  The JIT_CODE_DEBUG for a given function must always be generated BEFORE the 
JIT_CODE_LOAD for the function. This facilitates greatly the parser for the 
jitdump file.
+
+
+VIII/ JIT_CODE_CLOSE record
+
+
+The record type is optional.
+
+The record is used as a marker for the end of the jitted runtime. It can be 
replaced by the end of the file.
+
+The JIT_CODE_CLOSE record does not have any specific fields, the record header 
contains all the information needed.
+
+
+IX/ JIT_CODE_UNWINDING_INFO
+
+
+The record type is optional.
+
+The record is used to describe the unwinding information for a jitted function.
+
+The record has the following fields following the fixed-size record header in 
order:
+
+uint64_t unwind_data_size   : the size in bytes of the unwinding data table at 
the end of the record
+uint64_t eh_frame_hdr_size  : the size in bytes of the DWARF EH Frame Header 
at the start of the unwinding data table at the end of the record
+uint64_t mapped_size        : the size of the unwinding data mapped in memory
+const char unwinding_data[n]: an array of unwinding data, consisting of the EH 
Frame Header, followed by the actual EH Frame
+
+
+The EH Frame header follows the Linux Standard Base (LSB) specification as 
described in the document at 
https://refspecs.linuxfoundation.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html
+
+
+The EH Frame follows the LSB specicfication as described in the document at 
https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html
+
+
+NOTE: The mapped_size is generally either the same as unwind_data_size (if the 
unwinding data was mapped in memory by the running process) or zero (if the 
unwinding data is not mapped by the process). If the unwinding data was not 
mapped, then only the EH Frame Header will be read, which can be used to 
specify FP based unwinding for a function which does not have unwinding 
information.
-- 
1.9.1

Reply via email to