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="G1HeapRegionType" hr_name="G1 Heap Region Type"
 130                   type="U1" jvm_type="G1HEAPREGIONTYPE">
 131       <value type="UTF8" field="type" label="type" />
 132     </content_type>
 133     
 134     <content_type id="G1YCType" hr_name="G1 YC Type"
 135                   type="U1" jvm_type="G1YCTYPE">
 136       <value type="UTF8" field="type" label="type" />
 137     </content_type>
 138 
 139     <content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater"
 140                   type="U1" jvm_type="GCTHRESHOLDUPDATER">
 141       <value type="UTF8" field="updater" label="updater" />
 142     </content_type>
 143 
 144     <content_type id="ReferenceType" hr_name="Reference Type"
 145                   type="U1" jvm_type="REFERENCETYPE">
 146       <value type="UTF8" field="type" label="type" />
 147     </content_type>
 148 
 149     <content_type id="MetadataType" hr_name="Metadata Type"
 150                   type="U1" jvm_type="METADATATYPE">
 151       <value type="UTF8" field="type" label="type" />
 152     </content_type>
 153 
 154     <content_type id="MetaspaceObjectType" hr_name="Metaspace Object Type"
 155                   type="U1" jvm_type="METASPACEOBJTYPE">
 156       <value type="UTF8" field="type" label="type" />
 157     </content_type>
 158 
 159     <content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode"
 160                   type="U1" jvm_type="NARROWOOPMODE">
 161       <value type="UTF8" field="mode" label="mode" />
 162     </content_type>
 163 
 164     <content_type id="VMOperationType" hr_name="VM Operation Type"
 165                   type="U2" jvm_type="VMOPERATIONTYPE">
 166       <value type="UTF8" field="type" label="type" />
 167     </content_type>
 168 
 169     <content_type id="CompilerPhaseType" hr_name="Compiler Phase Type"
 170                   type="U1" jvm_type="COMPILERPHASETYPE">
 171       <value type="UTF8" field="phase" label="phase" />
 172     </content_type>
 173 
 174     <content_type id="FlagValueOrigin" hr_name="Flag Value Origin"
 175                   type="U1" jvm_type="FLAGVALUEORIGIN">
 176       <value type="UTF8" field="origin" label="origin" />
 177     </content_type>
 178 
 179     <content_type id="CodeBlobType" hr_name="Code Blob Type"
 180                   type="U1" jvm_type="CODEBLOBTYPE">
 181       <value type="UTF8" field="type" label="type" />
 182     </content_type>
 183 
 184     <content_type id="InflateCause" hr_name="Inflation Cause"
 185                   type="U1" jvm_type="INFLATECAUSE">
 186       <value type="UTF8" field="cause" label="cause" />
 187     </content_type>
 188   </content_types>
 189 
 190 
 191   <primary_types>
 192     <!--
 193       - primary_type takes these attributes:
 194       -   symbol      INTEGER, LONG etc
 195       -   datatype    The trace datatype, see enum DataType
 196       -   contenttype Either resolved content type or the semantic meaning
 197       -   type        The actual type as used in structures etc
 198       -   sizeop      A function/macro that can be applied on a single
 199       -               struct value of type "type" and yield the factual byte
 200       -               size we need to write.  The % is replaced by the value
 201       -->
 202 
 203     <!-- SIGNED 64bit -->
 204     <primary_type symbol="LONG" datatype="LONG" contenttype="NONE"
 205                   type="s8" sizeop="sizeof(s8)"/>
 206 
 207     <!-- UNSIGNED 64bit -->
 208     <primary_type symbol="ULONG" datatype="U8" contenttype="NONE"
 209                   type="u8" sizeop="sizeof(u8)"/>
 210 
 211     <!-- SIGNED 32bit -->
 212     <primary_type symbol="INTEGER" datatype="INT" contenttype="NONE"
 213                   type="s4" sizeop="sizeof(s4)"/>
 214 
 215     <!-- UNSIGNED 32bit -->
 216     <primary_type symbol="UINT" datatype="U4" contenttype="NONE"
 217                   type="unsigned" sizeop="sizeof(unsigned)"/>
 218 
 219     <!-- UNSIGNED 16bit -->
 220     <primary_type symbol="USHORT" datatype="U2" contenttype="NONE"
 221                   type="u2" sizeop="sizeof(u2)"/>
 222 
 223     <!--  SIGNED 16bit -->
 224     <primary_type symbol="SHORT" datatype="SHORT" contenttype="NONE"
 225                   type="s2" sizeop="sizeof(s2)"/>
 226 
 227     <!--  SIGNED 8bit -->
 228     <primary_type symbol="BYTE" datatype="BYTE" contenttype="NONE"
 229                   type="s1" sizeop="sizeof(s1)"/>
 230 
 231     <!--  UNSIGNED 8bit -->
 232     <primary_type symbol="UBYTE" datatype="U1" contenttype="NONE"
 233                   type="u1" sizeop="sizeof(u1)"/>
 234 
 235     <!--  float 32bit -->
 236     <primary_type symbol="FLOAT" datatype="FLOAT" contenttype="NONE"
 237                   type="float" sizeop="sizeof(float)"/>
 238 
 239     <!--  float 64bit -->
 240     <primary_type symbol="DOUBLE" datatype="DOUBLE" contenttype="NONE"
 241                   type="double" sizeop="sizeof(double)"/>
 242 
 243     <!-- boolean type (1-byte) -->
 244     <primary_type symbol="BOOLEAN" datatype="BOOLEAN" contenttype="NONE"
 245                   type="bool" sizeop="1"/>
 246 
 247     <!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
 248     <primary_type symbol="BYTES" datatype="U4" contenttype="BYTES"
 249                   type="u4" sizeop="sizeof(u4)"/>
 250 
 251     <primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES"
 252                   type="u4" sizeop="sizeof(u4)"/>
 253 
 254     <!-- 64-bit unsigned integer, SEMANTIC value BYTES -->
 255     <primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES"
 256                   type="u8" sizeop="sizeof(u8)"/>
 257 
 258     <!-- 64-bit unsigned integer, SEMANTIC value ABSOLUTE MILLISECONDS -->
 259     <primary_type symbol="EPOCHMILLIS" datatype="LONG" contenttype="EPOCHMILLIS"
 260                   type="s8" sizeop="sizeof(s8)"/>
 261 
 262     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE MILLISECONDS -->
 263     <primary_type symbol="MILLIS" datatype="LONG" contenttype="MILLIS"
 264                   type="s8" sizeop="sizeof(s8)"/>
 265 
 266     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE NANOSECONDS -->
 267     <primary_type symbol="NANOS" datatype="LONG" contenttype="NANOS"
 268                   type="s8" sizeop="sizeof(s8)"/>
 269 
 270     <!-- 64-bit signed integer, SEMANTIC value TICKS -->
 271     <primary_type symbol="TICKS" datatype="LONG" contenttype="TICKS"
 272                   type="Ticks" sizeop="sizeof(s8)"/>
 273 
 274     <!-- 64-bit signed integer, SEMANTIC value TICKS duration -->
 275     <primary_type symbol="TICKSPAN" datatype="LONG" contenttype="TICKS"
 276                   type="Tickspan" sizeop="sizeof(s8)"/>
 277 
 278     <!-- 64-bit unsigned integer, SEMANTIC value ADDRESS (mem loc) -->
 279     <primary_type symbol="ADDRESS" datatype="U8" contenttype="ADDRESS"
 280                   type="u8" sizeop="sizeof(u8)"/>
 281 
 282     <!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) -->
 283     <primary_type symbol="PERCENT" datatype="FLOAT" contenttype="PERCENTAGE"
 284                   type="float" sizeop="sizeof(float)"/>
 285 
 286     <!-- UTF-encoded string, max length 64k -->
 287     <primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
 288                   type="const char *" sizeop="sizeof_utf(%)"/>
 289 
 290     <!-- UTF-16 encoded (Unicode) string, max length maxjuint -->
 291     <primary_type symbol="STRING" datatype="STRING" contenttype="NONE"
 292                   type="TraceUnicodeString*" sizeop="sizeof_unicode(%)"/>
 293 
 294     <!-- Symbol* constant. Note that this may currently ONLY be used by
 295           classes, methods fields.  This restriction might be lifted. -->
 296     <primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL"
 297                   type="Symbol *" sizeop="sizeof(u8)"/>
 298 
 299     <!-- A Klass *. The actual class is marked as "used" and will
 300          eventually be written into the recording constant pool -->
 301     <primary_type symbol="CLASS" datatype="U8" contenttype="CLASS"
 302                   type="Klass *" sizeop="sizeof(u8)"/>
 303 
 304     <!-- A Method *. The method is marked as "used" and will eventually be
 305          written into the recording constant pool. -->
 306     <primary_type symbol="METHOD" datatype="U8" contenttype="METHOD"
 307                   type="Method *" sizeop="sizeof(u8)"/>
 308 
 309     <!--  The type for stacktraces in the recording. Shoudl not be used by
 310           events explicitly -->
 311     <primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
 312                   type="u8" sizeop="sizeof(u8)"/>
 313 
 314     <!-- OS Thread ID -->
 315     <primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD"
 316                   type="u4" sizeop="sizeof(u4)"/>
 317 
 318     <!-- VM Thread ID Note: changed from U2 to U8 for hotspot -->
 319     <primary_type symbol="VMTHREAD" datatype="U8" contenttype="VMTHREAD"
 320                   type="u8"  sizeop="sizeof(u8)"/>
 321 
 322     <!-- Java Thread ID -->
 323     <primary_type symbol="JAVALANGTHREAD" datatype="LONG"
 324                   contenttype="JAVALANGTHREAD" type="s8"
 325                   sizeop="sizeof(s8)"/>
 326 
 327     <!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
 328           for thread constant pool // KK TODO: u8 should be ObjectP -->
 329     <primary_type symbol="THREADGROUP" datatype="U4" contenttype="THREADGROUP"
 330                   type="u8"
 331                   sizeop="sizeof(u4)"/>
 332 
 333     <!-- FRAMETYPE enum -->
 334     <primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE"
 335                   type="u1" sizeop="sizeof(u1)"/>
 336 
 337     <!-- THREADSTATE enum -->
 338     <primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE"
 339                   type="u2" sizeop="sizeof(u2)"/>
 340 
 341     <!-- GCName -->
 342     <primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME"
 343                   type="u1" sizeop="sizeof(u1)" />
 344 
 345     <!-- GCCAUSE -->
 346     <primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE"
 347                   type="u2" sizeop="sizeof(u2)" />
 348 
 349     <!-- GCWHEN -->
 350     <primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN"
 351                   type="u1" sizeop="sizeof(u1)" />
 352 
 353     <!-- G1HEAPREGIONTYPE -->
 354     <primary_type symbol="G1HEAPREGIONTYPE" datatype="U1" contenttype="G1HEAPREGIONTYPE"
 355                   type="u1" sizeop="sizeof(u1)" />
 356 
 357     <!-- G1YCType -->
 358     <primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE"
 359                   type="u1" sizeop="sizeof(u1)" />
 360 
 361     <!-- GCTHRESHOLDUPDATER -->
 362     <primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER"
 363                   type="u1" sizeop="sizeof(u1)" />
 364 
 365     <!-- REFERENCETYPE -->
 366     <primary_type symbol="REFERENCETYPE" datatype="U1"
 367                   contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" />
 368 
 369     <!-- METADATATYPE -->
 370     <primary_type symbol="METADATATYPE" datatype="U1"
 371                   contenttype="METADATATYPE" type="u1" sizeop="sizeof(u1)" />
 372 
 373     <!-- METADATAOBJTYPE -->
 374     <primary_type symbol="METASPACEOBJTYPE" datatype="U1"
 375                   contenttype="METASPACEOBJTYPE" type="u1" sizeop="sizeof(u1)" />
 376 
 377     <!-- NARROWOOPMODE -->
 378     <primary_type symbol="NARROWOOPMODE" datatype="U1"
 379                   contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" />
 380 
 381     <!-- COMPILERPHASETYPE -->
 382     <primary_type symbol="COMPILERPHASETYPE" datatype="U1"
 383                   contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" />
 384 
 385     <!-- VMOPERATIONTYPE -->
 386     <primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE"
 387                   type="u2" sizeop="sizeof(u2)" />
 388                   
 389     <!-- FLAGVALUEORIGIN -->
 390     <primary_type symbol="FLAGVALUEORIGIN" datatype="U1"
 391                   contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" />
 392                   
 393     <!-- CODEBLOBTYPE -->
 394     <primary_type symbol="CODEBLOBTYPE" datatype="U1"
 395                   contenttype="CODEBLOBTYPE" type="u1" sizeop="sizeof(u1)" />
 396 
 397     <!-- INFLATECAUSE -->
 398     <primary_type symbol="INFLATECAUSE" datatype="U1"
 399                   contenttype="INFLATECAUSE" type="u1" sizeop="sizeof(u1)" />
 400   </primary_types>
 401 </types>