1 <?xml version="1.0" encoding="utf-8"?>
   2 <!--
   3  Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
   4  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 
   6  This code is free software; you can redistribute it and/or modify it
   7  under the terms of the GNU General Public License version 2 only, as
   8  published by the Free Software Foundation.
   9 
  10  This code is distributed in the hope that it will be useful, but WITHOUT
  11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  version 2 for more details (a copy is included in the LICENSE file that
  14  accompanied this code).
  15 
  16  You should have received a copy of the GNU General Public License version
  17  2 along with this work; if not, write to the Free Software Foundation,
  18  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19 
  20  Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  or visit www.oracle.com if you need additional information or have any
  22  questions.
  23 -->
  24 
  25 <!DOCTYPE types SYSTEM "trace.dtd">
  26 
  27 <!--
  28 
  29 Content types (complex) should create constant pool data
  30 in the recording.
  31 Currently at least, there is _NO_ verification that whatever
  32 writer you have is actually writing correctly. So BE CAREFUL!
  33 
  34 Declared with the 'content_type' tag.
  35 
  36 <type> is the ID type, i.e the integer type that resolves this. Most often
  37 U4 or U8, but for example really small number constants, like GCTYPE uses U1.
  38 
  39 <content-type> is where it gets interesting. 'builtin_type' means we're
  40 defining how we resolve one of the trace built-in types (Class, Thread etc),
  41 jvm_type means defining a new one for our own use.
  42 
  43 Example: (GcMode)
  44 
  45 <content_type id="GCMode" hr_name="GC mode" type="U1" jvm_type="GCMODE">
  46   <value type="UTF8" field="desc" description="Description"/>
  47 </content_type>
  48 
  49 This creates a content type CONTENT_TYPE_GCMODE
  50 The field type referencing it is u1 (U1), and the constant pool struct has one field, the name.
  51 
  52 Before we can use it we need also define a primary field data type:
  53 
  54 <primary_type symbol="GCMODE" datatype="U1" contenttype="NONE"
  55               type="u8" sizeop="sizeof(u1)"/>
  56 
  57 Now we can use the content + data type in declaring event fields.
  58  -->
  59 
  60  <types>
  61   <content_types>
  62     <content_type id="Thread" hr_name="Thread"
  63                   type="U4" builtin_type="OSTHREAD">
  64       <value type="UTF8" field="name" label="Thread name"/>
  65     </content_type>
  66 
  67     <content_type id="VMThread" hr_name="VM Thread"
  68                   type="U8" jvm_type="VMTHREAD">
  69       <value type="OSTHREAD" field="thread" label="VM Thread"/>
  70     </content_type>
  71 
  72     <content_type id="JavaThread" hr_name="Java thread"
  73                   type="U8" builtin_type="JAVALANGTHREAD">
  74       <value type="OSTHREAD" field="thread" label="OS Thread ID"/>
  75       <value type="BYTES64" field="allocInsideTla"
  76              label="Allocated bytes inside TLAs"/>
  77       <value type="BYTES64" field="allocOutsideTla"
  78              label="Allocated bytes outside TLAs"/>
  79       <value type="THREADGROUP" field="group" label="Java Thread Group"/>
  80     </content_type>
  81 
  82     <content_type id="ThreadGroup" hr_name="Thread group"
  83                   type="U4" jvm_type="THREADGROUP">
  84       <value type="THREADGROUP" field="parent" label="Parent"/>
  85       <value type="UTF8" field="name" label="Name"/>
  86     </content_type>
  87 
  88     <content_type id="Class" hr_name="Java class"
  89                   type="U8" builtin_type="CLASS">
  90       <value type="CLASS" field="loaderClass" label="ClassLoader"/>
  91       <value type="SYMBOL" field="name" label="Name"/>
  92       <value type="SHORT" field="modifiers" label="Access modifiers"/>
  93     </content_type>
  94 
  95     <content_type id="Method" hr_name="Java method"
  96                   type="U8" jvm_type="METHOD">
  97       <value type="CLASS" field="class" label="Class"/>
  98       <value type="SYMBOL" field="name" label="Name"/>
  99       <value type="SYMBOL" field="signature" label="Signature"/>
 100       <value type="SHORT" field="modifiers" label="Access modifiers"/>
 101       <value type="BOOLEAN" field="hidden" label="Hidden"/>
 102     </content_type>
 103 
 104     <content_type id="UTFConstant" hr_name="UTF constant"
 105                   type="U8" jvm_type="SYMBOL">
 106       <value type="UTF8" field="utf8" label="UTF8 data"/>
 107     </content_type>
 108 
 109     <content_type id="ThreadState" hr_name="Java Thread State"
 110                   type="U2" jvm_type="THREADSTATE">
 111       <value type="UTF8" field="name" label="Name"/>
 112     </content_type>
 113 
 114     <content_type id="GCName" hr_name="GC Name"
 115                   type="U1" jvm_type="GCNAME">
 116       <value type="UTF8" field="name" label="name" />
 117     </content_type>
 118 
 119     <content_type id="GCCause" hr_name="GC Cause"
 120                   type="U2" jvm_type="GCCAUSE">
 121       <value type="UTF8" field="cause" label="cause" />
 122     </content_type>
 123 
 124     <content_type id="GCWhen" hr_name="GC When"
 125                   type="U1" jvm_type="GCWHEN">
 126       <value type="UTF8" field="when" label="when" />
 127     </content_type>
 128 
 129     <content_type id="G1YCType" hr_name="G1 YC Type"
 130                   type="U1" jvm_type="G1YCTYPE">
 131       <value type="UTF8" field="type" label="type" />
 132     </content_type>
 133 
 134     <content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater"
 135                   type="U1" jvm_type="GCTHRESHOLDUPDATER">
 136       <value type="UTF8" field="updater" label="updater" />
 137     </content_type>
 138 
 139     <content_type id="ReferenceType" hr_name="Reference Type"
 140                   type="U1" jvm_type="REFERENCETYPE">
 141       <value type="UTF8" field="type" label="type" />
 142     </content_type>
 143 
 144     <content_type id="MetadataType" hr_name="Metadata Type"
 145                   type="U1" jvm_type="METADATATYPE">
 146       <value type="UTF8" field="type" label="type" />
 147     </content_type>
 148 
 149     <content_type id="MetaspaceObjectType" hr_name="Metaspace Object Type"
 150                   type="U1" jvm_type="METASPACEOBJTYPE">
 151       <value type="UTF8" field="type" label="type" />
 152     </content_type>
 153 
 154     <content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode"
 155                   type="U1" jvm_type="NARROWOOPMODE">
 156       <value type="UTF8" field="mode" label="mode" />
 157     </content_type>
 158 
 159     <content_type id="VMOperationType" hr_name="VM Operation Type"
 160                   type="U2" jvm_type="VMOPERATIONTYPE">
 161       <value type="UTF8" field="type" label="type" />
 162     </content_type>
 163 
 164     <content_type id="CompilerPhaseType" hr_name="Compiler Phase Type"
 165                   type="U1" jvm_type="COMPILERPHASETYPE">
 166       <value type="UTF8" field="phase" label="phase" />
 167     </content_type>
 168 
 169     <content_type id="FlagValueOrigin" hr_name="Flag Value Origin"
 170                   type="U1" jvm_type="FLAGVALUEORIGIN">
 171       <value type="UTF8" field="origin" label="origin" />
 172     </content_type>
 173 
 174     <content_type id="CodeBlobType" hr_name="Code Blob Type"
 175                   type="U1" jvm_type="CODEBLOBTYPE">
 176       <value type="UTF8" field="type" label="type" />
 177     </content_type>
 178 
 179     <content_type id="InflateCause" hr_name="Inflation Cause"
 180                   type="U1" jvm_type="INFLATECAUSE">
 181       <value type="UTF8" field="cause" label="cause" />
 182     </content_type>
 183   </content_types>
 184 
 185 
 186   <primary_types>
 187     <!--
 188       - primary_type takes these attributes:
 189       -   symbol      INTEGER, LONG etc
 190       -   datatype    The trace datatype, see enum DataType
 191       -   contenttype Either resolved content type or the semantic meaning
 192       -   type        The actual type as used in structures etc
 193       -   sizeop      A function/macro that can be applied on a single
 194       -               struct value of type "type" and yield the factual byte
 195       -               size we need to write.  The % is replaced by the value
 196       -->
 197 
 198     <!-- SIGNED 64bit -->
 199     <primary_type symbol="LONG" datatype="LONG" contenttype="NONE"
 200                   type="s8" sizeop="sizeof(s8)"/>
 201 
 202     <!-- UNSIGNED 64bit -->
 203     <primary_type symbol="ULONG" datatype="U8" contenttype="NONE"
 204                   type="u8" sizeop="sizeof(u8)"/>
 205 
 206     <!-- SIGNED 32bit -->
 207     <primary_type symbol="INTEGER" datatype="INT" contenttype="NONE"
 208                   type="s4" sizeop="sizeof(s4)"/>
 209 
 210     <!-- UNSIGNED 32bit -->
 211     <primary_type symbol="UINT" datatype="U4" contenttype="NONE"
 212                   type="unsigned" sizeop="sizeof(unsigned)"/>
 213 
 214     <!-- UNSIGNED 16bit -->
 215     <primary_type symbol="USHORT" datatype="U2" contenttype="NONE"
 216                   type="u2" sizeop="sizeof(u2)"/>
 217 
 218     <!--  SIGNED 16bit -->
 219     <primary_type symbol="SHORT" datatype="SHORT" contenttype="NONE"
 220                   type="s2" sizeop="sizeof(s2)"/>
 221 
 222     <!--  SIGNED 8bit -->
 223     <primary_type symbol="BYTE" datatype="BYTE" contenttype="NONE"
 224                   type="s1" sizeop="sizeof(s1)"/>
 225 
 226     <!--  UNSIGNED 8bit -->
 227     <primary_type symbol="UBYTE" datatype="U1" contenttype="NONE"
 228                   type="u1" sizeop="sizeof(u1)"/>
 229 
 230     <!--  float 32bit -->
 231     <primary_type symbol="FLOAT" datatype="FLOAT" contenttype="NONE"
 232                   type="float" sizeop="sizeof(float)"/>
 233 
 234     <!--  float 64bit -->
 235     <primary_type symbol="DOUBLE" datatype="DOUBLE" contenttype="NONE"
 236                   type="double" sizeop="sizeof(double)"/>
 237 
 238     <!-- boolean type (1-byte) -->
 239     <primary_type symbol="BOOLEAN" datatype="BOOLEAN" contenttype="NONE"
 240                   type="bool" sizeop="1"/>
 241 
 242     <!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
 243     <primary_type symbol="BYTES" datatype="U4" contenttype="BYTES"
 244                   type="u4" sizeop="sizeof(u4)"/>
 245 
 246     <primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES"
 247                   type="u4" sizeop="sizeof(u4)"/>
 248 
 249     <!-- 64-bit unsigned integer, SEMANTIC value BYTES -->
 250     <primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES"
 251                   type="u8" sizeop="sizeof(u8)"/>
 252 
 253     <!-- 64-bit unsigned integer, SEMANTIC value ABSOLUTE MILLISECONDS -->
 254     <primary_type symbol="EPOCHMILLIS" datatype="LONG" contenttype="EPOCHMILLIS"
 255                   type="s8" sizeop="sizeof(s8)"/>
 256 
 257     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE MILLISECONDS -->
 258     <primary_type symbol="MILLIS" datatype="LONG" contenttype="MILLIS"
 259                   type="s8" sizeop="sizeof(s8)"/>
 260 
 261     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE NANOSECONDS -->
 262     <primary_type symbol="NANOS" datatype="LONG" contenttype="NANOS"
 263                   type="s8" sizeop="sizeof(s8)"/>
 264 
 265     <!-- 64-bit signed integer, SEMANTIC value TICKS -->
 266     <primary_type symbol="TICKS" datatype="LONG" contenttype="TICKS"
 267                   type="Ticks" sizeop="sizeof(s8)"/>
 268 
 269     <!-- 64-bit signed integer, SEMANTIC value TICKS duration -->
 270     <primary_type symbol="TICKSPAN" datatype="LONG" contenttype="TICKS"
 271                   type="Tickspan" sizeop="sizeof(s8)"/>
 272 
 273     <!-- 64-bit unsigned integer, SEMANTIC value ADDRESS (mem loc) -->
 274     <primary_type symbol="ADDRESS" datatype="U8" contenttype="ADDRESS"
 275                   type="u8" sizeop="sizeof(u8)"/>
 276 
 277     <!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) -->
 278     <primary_type symbol="PERCENT" datatype="FLOAT" contenttype="PERCENTAGE"
 279                   type="float" sizeop="sizeof(float)"/>
 280 
 281     <!-- UTF-encoded string, max length 64k -->
 282     <primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
 283                   type="const char *" sizeop="sizeof_utf(%)"/>
 284 
 285     <!-- UTF-16 encoded (Unicode) string, max length maxjuint -->
 286     <primary_type symbol="STRING" datatype="STRING" contenttype="NONE"
 287                   type="TraceUnicodeString*" sizeop="sizeof_unicode(%)"/>
 288 
 289     <!-- Symbol* constant. Note that this may currently ONLY be used by
 290           classes, methods fields.  This restriction might be lifted. -->
 291     <primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL"
 292                   type="Symbol *" sizeop="sizeof(u8)"/>
 293 
 294     <!-- A Klass *. The actual class is marked as "used" and will
 295          eventually be written into the recording constant pool -->
 296     <primary_type symbol="CLASS" datatype="U8" contenttype="CLASS"
 297                   type="Klass *" sizeop="sizeof(u8)"/>
 298 
 299     <!-- A Method *. The method is marked as "used" and will eventually be
 300          written into the recording constant pool. -->
 301     <primary_type symbol="METHOD" datatype="U8" contenttype="METHOD"
 302                   type="Method *" sizeop="sizeof(u8)"/>
 303 
 304     <!--  The type for stacktraces in the recording. Shoudl not be used by
 305           events explicitly -->
 306     <primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
 307                   type="u8" sizeop="sizeof(u8)"/>
 308 
 309     <!-- OS Thread ID -->
 310     <primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD"
 311                   type="u4" sizeop="sizeof(u4)"/>
 312 
 313     <!-- VM Thread ID Note: changed from U2 to U8 for hotspot -->
 314     <primary_type symbol="VMTHREAD" datatype="U8" contenttype="VMTHREAD"
 315                   type="u8"  sizeop="sizeof(u8)"/>
 316 
 317     <!-- Java Thread ID -->
 318     <primary_type symbol="JAVALANGTHREAD" datatype="LONG"
 319                   contenttype="JAVALANGTHREAD" type="s8"
 320                   sizeop="sizeof(s8)"/>
 321 
 322     <!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
 323           for thread constant pool // KK TODO: u8 should be ObjectP -->
 324     <primary_type symbol="THREADGROUP" datatype="U4" contenttype="THREADGROUP"
 325                   type="u8"
 326                   sizeop="sizeof(u4)"/>
 327 
 328     <!-- FRAMETYPE enum -->
 329     <primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE"
 330                   type="u1" sizeop="sizeof(u1)"/>
 331 
 332     <!-- THREADSTATE enum -->
 333     <primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE"
 334                   type="u2" sizeop="sizeof(u2)"/>
 335 
 336     <!-- GCName -->
 337     <primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME"
 338                   type="u1" sizeop="sizeof(u1)" />
 339 
 340     <!-- GCCAUSE -->
 341     <primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE"
 342                   type="u2" sizeop="sizeof(u2)" />
 343 
 344     <!-- GCWHEN -->
 345     <primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN"
 346                   type="u1" sizeop="sizeof(u1)" />
 347 
 348     <!-- G1YCType -->
 349     <primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE"
 350                   type="u1" sizeop="sizeof(u1)" />
 351 
 352     <!-- GCTHRESHOLDUPDATER -->
 353     <primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER"
 354                   type="u1" sizeop="sizeof(u1)" />
 355 
 356     <!-- REFERENCETYPE -->
 357     <primary_type symbol="REFERENCETYPE" datatype="U1"
 358                   contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" />
 359 
 360     <!-- METADATATYPE -->
 361     <primary_type symbol="METADATATYPE" datatype="U1"
 362                   contenttype="METADATATYPE" type="u1" sizeop="sizeof(u1)" />
 363 
 364     <!-- METADATAOBJTYPE -->
 365     <primary_type symbol="METASPACEOBJTYPE" datatype="U1"
 366                   contenttype="METASPACEOBJTYPE" type="u1" sizeop="sizeof(u1)" />
 367 
 368     <!-- NARROWOOPMODE -->
 369     <primary_type symbol="NARROWOOPMODE" datatype="U1"
 370                   contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" />
 371 
 372     <!-- COMPILERPHASETYPE -->
 373     <primary_type symbol="COMPILERPHASETYPE" datatype="U1"
 374                   contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" />
 375 
 376     <!-- VMOPERATIONTYPE -->
 377     <primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE"
 378                   type="u2" sizeop="sizeof(u2)" />
 379                   
 380     <!-- FLAGVALUEORIGIN -->
 381     <primary_type symbol="FLAGVALUEORIGIN" datatype="U1"
 382                   contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" />
 383                   
 384     <!-- CODEBLOBTYPE -->
 385     <primary_type symbol="CODEBLOBTYPE" datatype="U1"
 386                   contenttype="CODEBLOBTYPE" type="u1" sizeop="sizeof(u1)" />
 387 
 388     <!-- INFLATECAUSE -->
 389     <primary_type symbol="INFLATECAUSE" datatype="U1"
 390                   contenttype="INFLATECAUSE" type="u1" sizeop="sizeof(u1)" />
 391   </primary_types>
 392 </types>