Skip to content
Permalink
eaf6ab250d
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
433 lines (384 sloc) 12.5 KB
<?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>
<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>