442 lines
13 KiB
XML
442 lines
13 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
|
|
|
|
<include href="language_common.rxg" />
|
|
|
|
<!-- compiler_spec files have extension .cspec -->
|
|
|
|
<define name="value_type">
|
|
<attribute name="value"/>
|
|
</define>
|
|
|
|
<start>
|
|
<element name="compiler_spec">
|
|
<interleave>
|
|
<optional>
|
|
<ref name="properties_type"/>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="data_organization">
|
|
<interleave>
|
|
<optional>
|
|
<element name="absolute_max_alignment"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="machine_alignment"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="default_alignment"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="default_pointer_alignment"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="pointer_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="pointer_shift"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="char_type">
|
|
<attribute name="signed">
|
|
<ref name="boolean_type"/>
|
|
</attribute>
|
|
</element>
|
|
</optional>
|
|
<optional>
|
|
<element name="char_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="wchar_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="short_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="integer_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="long_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="long_long_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="float_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="double_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="long_double_size"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<element name="size_alignment_map">
|
|
<zeroOrMore>
|
|
<element name="entry">
|
|
<attribute name="size"/>
|
|
<attribute name="alignment"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
</element>
|
|
</optional>
|
|
<optional>
|
|
<element name="bitfield_packing">
|
|
<interleave>
|
|
<optional>
|
|
<!-- boolean value, default: false (MSVC should be true) -->
|
|
<element name="use_MS_convention"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<!-- boolean value, default: true -->
|
|
<element name="type_alignment_enabled"><ref name="value_type"/></element>
|
|
</optional>
|
|
<optional>
|
|
<!-- int value: number of bytes -->
|
|
<element name="zero_length_boundary"><ref name="value_type"/></element>
|
|
</optional>
|
|
</interleave>
|
|
</element>
|
|
</optional>
|
|
</interleave>
|
|
</element>
|
|
</optional>
|
|
|
|
<zeroOrMore>
|
|
<element name="callfixup">
|
|
<attribute name="name"/>
|
|
<zeroOrMore>
|
|
<element name="target">
|
|
<attribute name="name"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
<element name="pcode"><ref name="pcode_type"/></element>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<zeroOrMore>
|
|
<element name="callotherfixup">
|
|
<attribute name="targetop"/>
|
|
<element name="pcode"><ref name="pcode_type"/></element>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<!-- see language_common.rxg -->
|
|
<optional>
|
|
<element name="context_data">
|
|
<ref name="context_data_type"/>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="enum">
|
|
<attribute name="size"/>
|
|
<optional>
|
|
<attribute name="signed">
|
|
<ref name="boolean_type"/>
|
|
</attribute>
|
|
</optional>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="global">
|
|
<oneOrMore>
|
|
<ref name="memory_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="prefersplit">
|
|
<attribute name="style"/>
|
|
<oneOrMore>
|
|
<ref name="varnode_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="aggressivetrim">
|
|
<optional>
|
|
<attribute name="signext"/>
|
|
</optional>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="nohighptr">
|
|
<oneOrMore>
|
|
<ref name="memory_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="readonly">
|
|
<oneOrMore>
|
|
<ref name="memory_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="stackpointer">
|
|
<attribute name="register"/>
|
|
<attribute name="space"/>
|
|
<optional>
|
|
<attribute name="growth">
|
|
<choice>
|
|
<value>negative</value>
|
|
<value>positive</value>
|
|
</choice>
|
|
</attribute>
|
|
</optional>
|
|
<optional>
|
|
<attribute name="reversejustify">
|
|
<ref name="boolean_type"/>
|
|
</attribute>
|
|
</optional>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="returnaddress">
|
|
<ref name="varnode_tags_type"/>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="funcptr">
|
|
<attribute name="align"/>
|
|
</element>
|
|
</optional>
|
|
|
|
<zeroOrMore>
|
|
<element name="spacebase">
|
|
<attribute name="name"/>
|
|
<attribute name="register"/>
|
|
<attribute name="space"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<zeroOrMore>
|
|
<element name="deadcodedelay">
|
|
<attribute name="space"/>
|
|
<attribute name="delay"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<zeroOrMore>
|
|
<element name="inferptrbounds">
|
|
<oneOrMore>
|
|
<ref name="range_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<zeroOrMore>
|
|
<ref name="segmentop_type"/>
|
|
</zeroOrMore>
|
|
|
|
<element name="default_proto">
|
|
<element name="prototype">
|
|
<ref name="prototype_type"/>
|
|
</element>
|
|
</element>
|
|
|
|
<zeroOrMore>
|
|
<element name="prototype">
|
|
<ref name="prototype_type"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<zeroOrMore>
|
|
<element name="resolveprototype">
|
|
<attribute name="name"/>
|
|
<oneOrMore>
|
|
<element name="model">
|
|
<attribute name="name"/>
|
|
</element>
|
|
</oneOrMore>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<optional>
|
|
<element name="eval_current_prototype">
|
|
<attribute name="name"/>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="eval_called_prototype">
|
|
<attribute name="name"/>
|
|
</element>
|
|
</optional>
|
|
|
|
</interleave>
|
|
</element>
|
|
</start>
|
|
|
|
<define name="pentry_type">
|
|
<optional> <attribute name="maxsize"/> </optional>
|
|
<optional> <attribute name="minsize"/> </optional>
|
|
<optional> <attribute name="align"/> </optional>
|
|
<optional> <attribute name="metatype"/> </optional>
|
|
<optional>
|
|
<attribute name="trial">
|
|
<ref name="boolean_type"/>
|
|
</attribute>
|
|
</optional>
|
|
<optional> <attribute name="extension"/> </optional>
|
|
<!--
|
|
THIS IS THE WEAK ADDR TYPE. Attribute size is not required.
|
|
-->
|
|
<ref name="addr_tags_type"/>
|
|
</define>
|
|
|
|
<define name="rangelist_type">
|
|
<oneOrMore>
|
|
<ref name="range_type"/>
|
|
</oneOrMore>
|
|
</define>
|
|
|
|
<!--
|
|
Specifies generic calling convention for PrototypeModels
|
|
|
|
unknown: Unspecified convention (default)
|
|
|
|
stdcall: An MS Windows specific calling convention which
|
|
uses the stack to pass all parameters and where
|
|
the called-function is responsible for purging the stack.
|
|
|
|
cdecl: A standard/default calling convention which uses
|
|
the stack to pass all parameters and where the
|
|
caller is responsible for purging the stack.
|
|
|
|
fastcall: A standard/default calling convention
|
|
in which only registers are used to pass parameters
|
|
|
|
thiscall: A C++ instance method calling convention
|
|
|
|
-->
|
|
<define name="generic_calling_convention_type">
|
|
<choice>
|
|
<value type="string">unknown</value>
|
|
<value type="string">stdcall</value>
|
|
<value type="string">cdecl</value>
|
|
<value type="string">fastcall</value>
|
|
<value type="string">thiscall</value>
|
|
</choice>
|
|
</define>
|
|
|
|
<define name="prototype_type">
|
|
<attribute name="extrapop"/>
|
|
<attribute name="stackshift"/>
|
|
<attribute name="name"/>
|
|
<optional>
|
|
<attribute name="type">
|
|
<ref name="generic_calling_convention_type"/>
|
|
</attribute>
|
|
</optional>
|
|
|
|
<optional>
|
|
<attribute name="strategy">
|
|
<choice>
|
|
<value>standard</value>
|
|
<value>register</value>
|
|
</choice>
|
|
</attribute>
|
|
</optional>
|
|
|
|
<optional> <attribute name="hasthis"/> </optional>
|
|
<optional> <attribute name="constructor"/> </optional>
|
|
|
|
<interleave>
|
|
|
|
<element name="input">
|
|
<optional> <attribute name="pointermax"/> </optional>
|
|
<optional> <attribute name="thisbeforeretpointer"/> </optional>
|
|
<optional> <attribute name="killedbycall"/> </optional>
|
|
<zeroOrMore>
|
|
<element name="pentry">
|
|
<ref name="pentry_type"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
</element>
|
|
|
|
<element name="output">
|
|
<optional> <attribute name="killedbycall"/> </optional>
|
|
<zeroOrMore>
|
|
<element name="pentry">
|
|
<ref name="pentry_type"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
</element>
|
|
|
|
<!--
|
|
returnaddress describes where the return address is stored upon entry to
|
|
a function with this prototype.
|
|
-->
|
|
<optional>
|
|
<element name="returnaddress">
|
|
<oneOrMore>
|
|
<ref name="varnode_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="unaffected">
|
|
<interleave>
|
|
<oneOrMore>
|
|
<ref name="varnode_tags_type"/>
|
|
</oneOrMore>
|
|
</interleave>
|
|
</element>
|
|
</optional>
|
|
|
|
<!--
|
|
killedbycall places a "dividing line" in time so
|
|
that you can cut off references to a varnode from a previous
|
|
variable
|
|
-->
|
|
<optional>
|
|
<element name="killedbycall">
|
|
<oneOrMore>
|
|
<ref name="varnode_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<zeroOrMore>
|
|
<element name="pcode">
|
|
<attribute name="inject"/>
|
|
<ref name="pcode_type"/>
|
|
</element>
|
|
</zeroOrMore>
|
|
|
|
<!--
|
|
likelytrash indicates when calls will put random
|
|
data in places that could be construed as global data
|
|
-->
|
|
<optional>
|
|
<element name="likelytrash">
|
|
<oneOrMore>
|
|
<ref name="varnode_tags_type"/>
|
|
</oneOrMore>
|
|
</element>
|
|
</optional>
|
|
|
|
<optional>
|
|
<element name="localrange">
|
|
<ref name="rangelist_type"/>
|
|
</element>
|
|
</optional>
|
|
|
|
</interleave>
|
|
</define>
|
|
|
|
</grammar>
|