diff --git a/.gitignore b/.gitignore index d93697f..fde1c38 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ DerivedData/ Pods .ropeproject docs/build +Foxling/LLVM/llvm +Foxling/LLVM/llvm_build +Foxling/LLVM/llvm_output +Foxling/LLVM/llvm.tar.gz diff --git a/.travis.yml b/.travis.yml index e0768fd..6e2ad59 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,10 @@ env: matrix: - FOX_RUNTIME_IOS_SDK_VERSION=8.1 TYPE=ios - FOX_RUNTIME_OSX_SDK_VERSION=10.10 TYPE=osx + - FOX_RUNTIME_OSX_SDK_VERSION=10.10 TYPE=foxling + # - TYPE=podspec install: - sudo gem install cocoapods --pre script: - ./test clean $TYPE - # - pod spec lint Fox.podspec diff --git a/Fox-OSX-Specs/main.m b/Fox-OSX-Specs/main.m new file mode 100644 index 0000000..0db7518 --- /dev/null +++ b/Fox-OSX-Specs/main.m @@ -0,0 +1,10 @@ +#import +#import + +// Compiling tests as an executable allows for easy +// instrumentation for finding leaks / performance problems. +int main(int argc, const char * argv[]) { + @autoreleasepool { + return CDRRunSpecs(); + } +} diff --git a/Fox.xcodeproj/project.pbxproj b/Fox.xcodeproj/project.pbxproj index 1fb9268..3dbedeb 100644 --- a/Fox.xcodeproj/project.pbxproj +++ b/Fox.xcodeproj/project.pbxproj @@ -7,8 +7,36 @@ objects = { /* Begin PBXBuildFile section */ + 1F13AD711A60990C00DD65C6 /* FOXProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F13AD6F1A60990C00DD65C6 /* FOXProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F13AD721A60990C00DD65C6 /* FOXProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F13AD6F1A60990C00DD65C6 /* FOXProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F13AD731A60990C00DD65C6 /* FOXProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F13AD701A60990C00DD65C6 /* FOXProgram.m */; }; + 1F13AD741A60990C00DD65C6 /* FOXProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F13AD701A60990C00DD65C6 /* FOXProgram.m */; }; + 1F17D5471A3BF17D00E1BB60 /* FOXInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F17D5451A3BF17D00E1BB60 /* FOXInstrumentation.h */; }; + 1F17D5481A3BF17D00E1BB60 /* FOXInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F17D5451A3BF17D00E1BB60 /* FOXInstrumentation.h */; }; + 1F17D5491A3BF17D00E1BB60 /* FOXInstrumentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F17D5461A3BF17D00E1BB60 /* FOXInstrumentation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 1F17D54A1A3BF17D00E1BB60 /* FOXInstrumentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F17D5461A3BF17D00E1BB60 /* FOXInstrumentation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 1F2C101C1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F2C101B1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm */; }; 1F2C101D1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F2C101B1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm */; }; + 1F2E362D1A6BAA93009799D0 /* FOXArraySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E36291A6BAA93009799D0 /* FOXArraySequence.h */; }; + 1F2E362E1A6BAA93009799D0 /* FOXArraySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E36291A6BAA93009799D0 /* FOXArraySequence.h */; }; + 1F2E362F1A6BAA93009799D0 /* FOXArraySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E362A1A6BAA93009799D0 /* FOXArraySequence.m */; }; + 1F2E36301A6BAA93009799D0 /* FOXArraySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E362A1A6BAA93009799D0 /* FOXArraySequence.m */; }; + 1F2E36311A6BAA93009799D0 /* FOXRepeatedSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E362B1A6BAA93009799D0 /* FOXRepeatedSequence.h */; }; + 1F2E36321A6BAA93009799D0 /* FOXRepeatedSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E362B1A6BAA93009799D0 /* FOXRepeatedSequence.h */; }; + 1F2E36331A6BAA93009799D0 /* FOXRepeatedSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E362C1A6BAA93009799D0 /* FOXRepeatedSequence.m */; }; + 1F2E36341A6BAA93009799D0 /* FOXRepeatedSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E362C1A6BAA93009799D0 /* FOXRepeatedSequence.m */; }; + 1F2E36381A6C546B009799D0 /* FOXCyclicRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E36361A6C546B009799D0 /* FOXCyclicRandom.h */; }; + 1F2E36391A6C546B009799D0 /* FOXCyclicRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E36361A6C546B009799D0 /* FOXCyclicRandom.h */; }; + 1F2E363A1A6C546B009799D0 /* FOXCyclicRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E36371A6C546B009799D0 /* FOXCyclicRandom.m */; }; + 1F2E363B1A6C546B009799D0 /* FOXCyclicRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E36371A6C546B009799D0 /* FOXCyclicRandom.m */; }; + 1F2E363E1A6C5476009799D0 /* FOXSequenceRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E363C1A6C5476009799D0 /* FOXSequenceRandom.h */; }; + 1F2E363F1A6C5476009799D0 /* FOXSequenceRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E363C1A6C5476009799D0 /* FOXSequenceRandom.h */; }; + 1F2E36401A6C5476009799D0 /* FOXSequenceRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E363D1A6C5476009799D0 /* FOXSequenceRandom.m */; }; + 1F2E36411A6C5476009799D0 /* FOXSequenceRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2E363D1A6C5476009799D0 /* FOXSequenceRandom.m */; }; + 1F2F02251A3E8C090039D3B3 /* FOXMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2F02231A3E8C090039D3B3 /* FOXMath.h */; }; + 1F2F02261A3E8C090039D3B3 /* FOXMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2F02231A3E8C090039D3B3 /* FOXMath.h */; }; + 1F2F02271A3E8C090039D3B3 /* FOXMath.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2F02241A3E8C090039D3B3 /* FOXMath.m */; }; + 1F2F02281A3E8C090039D3B3 /* FOXMath.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2F02241A3E8C090039D3B3 /* FOXMath.m */; }; 1F38B61B1A2ACCA80078FF90 /* FOXBlockGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F35BC39198F7C9A00BEA6E1 /* FOXBlockGenerator.h */; }; 1F38B61C1A2ACCA80078FF90 /* FOXBlockGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC3A198F7C9A00BEA6E1 /* FOXBlockGenerator.m */; }; 1F38B61D1A2ACCA80078FF90 /* FOXArrayGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F35BC25198D881900BEA6E1 /* FOXArrayGenerator.h */; }; @@ -63,16 +91,16 @@ 1F38B64E1A2ACCAE0078FF90 /* FOXLazySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBEB1987773F0059D31A /* FOXLazySequence.m */; }; 1F38B64F1A2ACCAE0078FF90 /* FOXSequenceEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8FDBF0198777540059D31A /* FOXSequenceEnumerator.h */; }; 1F38B6501A2ACCAE0078FF90 /* FOXSequenceEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBF1198777540059D31A /* FOXSequenceEnumerator.m */; }; - 1F38B6551A2ACCAE0078FF90 /* FOXArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B73986A5F5236203E7B0F4 /* FOXArray.h */; }; - 1F38B6561A2ACCAE0078FF90 /* FOXArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B736F4E4E7DC1C8ACFC73A /* FOXArray.m */; }; + 1F38B6551A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B73986A5F5236203E7B0F4 /* FOXPrettyArray.h */; }; + 1F38B6561A2ACCAE0078FF90 /* FOXPrettyArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B736F4E4E7DC1C8ACFC73A /* FOXPrettyArray.m */; }; 1F38B6571A2ACCAE0078FF90 /* FOXConcreteSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8FDBE81987773F0059D31A /* FOXConcreteSequence.h */; }; 1F38B6581A2ACCAE0078FF90 /* FOXConcreteSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBE91987773F0059D31A /* FOXConcreteSequence.m */; }; 1F38B6591A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8FDBEA1987773F0059D31A /* FOXLazySequence.h */; }; 1F38B65A1A2ACCAE0078FF90 /* FOXLazySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBEB1987773F0059D31A /* FOXLazySequence.m */; }; 1F38B65B1A2ACCAE0078FF90 /* FOXSequenceEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8FDBF0198777540059D31A /* FOXSequenceEnumerator.h */; }; 1F38B65C1A2ACCAE0078FF90 /* FOXSequenceEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBF1198777540059D31A /* FOXSequenceEnumerator.m */; }; - 1F38B6611A2ACCAE0078FF90 /* FOXArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B73986A5F5236203E7B0F4 /* FOXArray.h */; }; - 1F38B6621A2ACCAE0078FF90 /* FOXArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B736F4E4E7DC1C8ACFC73A /* FOXArray.m */; }; + 1F38B6611A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B73986A5F5236203E7B0F4 /* FOXPrettyArray.h */; }; + 1F38B6621A2ACCAE0078FF90 /* FOXPrettyArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B736F4E4E7DC1C8ACFC73A /* FOXPrettyArray.m */; }; 1F38B6631A2ACCC00078FF90 /* FOXCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B73FBA1C97463CD5A8D15D /* FOXCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1F38B6641A2ACCC00078FF90 /* FOXCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B73C0260617192E88A3392 /* FOXCommand.m */; }; 1F38B6651A2ACCC00078FF90 /* FOXExecutedCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9BDD9519EA501500BAF25E /* FOXExecutedCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -228,10 +256,52 @@ 1F38B6FB1A2ACF910078FF90 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FF6737D1A2AC7E200F98D20 /* UIKit.framework */; }; 1F41BE9B1A2ACB9C00F25A65 /* Fox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F41BE901A2ACB9C00F25A65 /* Fox.framework */; }; 1F41BEB91A2ACBA300F25A65 /* Fox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F41BEAE1A2ACBA300F25A65 /* Fox.framework */; }; + 1F4A56A31A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56A21A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm */; }; + 1F4A56A41A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56A21A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm */; }; + 1F4A56A71A3B4CE9009E1637 /* FOXStateMachineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F4A56A51A3B4CE9009E1637 /* FOXStateMachineGenerator.h */; }; + 1F4A56A81A3B4CE9009E1637 /* FOXStateMachineGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F4A56A51A3B4CE9009E1637 /* FOXStateMachineGenerator.h */; }; + 1F4A56A91A3B4CE9009E1637 /* FOXStateMachineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56A61A3B4CE9009E1637 /* FOXStateMachineGenerator.m */; }; + 1F4A56AA1A3B4CE9009E1637 /* FOXStateMachineGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56A61A3B4CE9009E1637 /* FOXStateMachineGenerator.m */; }; + 1F4A57221A3BB73C009E1637 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F4A57211A3BB73C009E1637 /* CoreServices.framework */; }; + 1F4A57241A3BB742009E1637 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F4A57231A3BB742009E1637 /* MobileCoreServices.framework */; }; 1F4CA2CD1A2D747300989740 /* Cedar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F4CA2CC1A2D747300989740 /* Cedar.framework */; }; 1F4CA2CF1A2D747700989740 /* libCedar-StaticLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F4CA2CE1A2D747700989740 /* libCedar-StaticLib.a */; }; 1F6A7DDA1A35241700EA3482 /* FOXDoubleSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F6A7DD91A35241700EA3482 /* FOXDoubleSpec.mm */; }; 1F6A7DDB1A35241700EA3482 /* FOXDoubleSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F6A7DD91A35241700EA3482 /* FOXDoubleSpec.mm */; }; + 1F6DE1741A4F66F900C93B28 /* decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1631A4F66F900C93B28 /* decode.c */; }; + 1F6DE1751A4F66F900C93B28 /* decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1631A4F66F900C93B28 /* decode.c */; }; + 1F6DE1761A4F66F900C93B28 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1641A4F66F900C93B28 /* decode.h */; }; + 1F6DE1771A4F66F900C93B28 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1641A4F66F900C93B28 /* decode.h */; }; + 1F6DE1781A4F66F900C93B28 /* extern.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1651A4F66F900C93B28 /* extern.h */; }; + 1F6DE1791A4F66F900C93B28 /* extern.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1651A4F66F900C93B28 /* extern.h */; }; + 1F6DE17A1A4F66F900C93B28 /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1661A4F66F900C93B28 /* input.c */; }; + 1F6DE17B1A4F66F900C93B28 /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1661A4F66F900C93B28 /* input.c */; }; + 1F6DE17C1A4F66F900C93B28 /* input.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1671A4F66F900C93B28 /* input.h */; }; + 1F6DE17D1A4F66F900C93B28 /* input.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1671A4F66F900C93B28 /* input.h */; }; + 1F6DE17E1A4F66F900C93B28 /* itab.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1681A4F66F900C93B28 /* itab.c */; }; + 1F6DE17F1A4F66F900C93B28 /* itab.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1681A4F66F900C93B28 /* itab.c */; }; + 1F6DE1801A4F66F900C93B28 /* itab.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1691A4F66F900C93B28 /* itab.h */; }; + 1F6DE1811A4F66F900C93B28 /* itab.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1691A4F66F900C93B28 /* itab.h */; }; + 1F6DE1821A4F66F900C93B28 /* syn-att.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16A1A4F66F900C93B28 /* syn-att.c */; }; + 1F6DE1831A4F66F900C93B28 /* syn-att.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16A1A4F66F900C93B28 /* syn-att.c */; }; + 1F6DE1841A4F66F900C93B28 /* syn-intel.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16B1A4F66F900C93B28 /* syn-intel.c */; }; + 1F6DE1851A4F66F900C93B28 /* syn-intel.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16B1A4F66F900C93B28 /* syn-intel.c */; }; + 1F6DE1861A4F66F900C93B28 /* syn.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16C1A4F66F900C93B28 /* syn.c */; }; + 1F6DE1871A4F66F900C93B28 /* syn.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE16C1A4F66F900C93B28 /* syn.c */; }; + 1F6DE1881A4F66F900C93B28 /* syn.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16D1A4F66F900C93B28 /* syn.h */; }; + 1F6DE1891A4F66F900C93B28 /* syn.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16D1A4F66F900C93B28 /* syn.h */; }; + 1F6DE18A1A4F66F900C93B28 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16E1A4F66F900C93B28 /* types.h */; }; + 1F6DE18B1A4F66F900C93B28 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16E1A4F66F900C93B28 /* types.h */; }; + 1F6DE18C1A4F66F900C93B28 /* udint.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16F1A4F66F900C93B28 /* udint.h */; }; + 1F6DE18D1A4F66F900C93B28 /* udint.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE16F1A4F66F900C93B28 /* udint.h */; }; + 1F6DE18E1A4F66F900C93B28 /* udis86.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1701A4F66F900C93B28 /* udis86.c */; }; + 1F6DE18F1A4F66F900C93B28 /* udis86.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1701A4F66F900C93B28 /* udis86.c */; }; + 1F6DE1901A4F66F900C93B28 /* mach_override.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1711A4F66F900C93B28 /* mach_override.c */; }; + 1F6DE1911A4F66F900C93B28 /* mach_override.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F6DE1711A4F66F900C93B28 /* mach_override.c */; }; + 1F6DE1921A4F66F900C93B28 /* mach_override.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1721A4F66F900C93B28 /* mach_override.h */; }; + 1F6DE1931A4F66F900C93B28 /* mach_override.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1721A4F66F900C93B28 /* mach_override.h */; }; + 1F6DE1941A4F66F900C93B28 /* udis86.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1731A4F66F900C93B28 /* udis86.h */; }; + 1F6DE1951A4F66F900C93B28 /* udis86.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F6DE1731A4F66F900C93B28 /* udis86.h */; }; 1F71D4E91A3105050017E81A /* FOXEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F71D4E71A3105050017E81A /* FOXEnvironment.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1F71D4EA1A3105050017E81A /* FOXEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F71D4E71A3105050017E81A /* FOXEnvironment.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1F71D4EB1A3105050017E81A /* FOXEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4E81A3105050017E81A /* FOXEnvironment.m */; }; @@ -248,6 +318,78 @@ 1F71D4FB1A3143A70017E81A /* FOXResizeSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4F91A3143A70017E81A /* FOXResizeSpec.mm */; }; 1F71D4FD1A3147570017E81A /* FOXAnyObjectSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4FC1A3147570017E81A /* FOXAnyObjectSpec.mm */; }; 1F71D4FE1A3147570017E81A /* FOXAnyObjectSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4FC1A3147570017E81A /* FOXAnyObjectSpec.mm */; }; + 1F7B0A9E1A4C9160003BDF21 /* FOXThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B0A9C1A4C9160003BDF21 /* FOXThread.h */; }; + 1F7B0A9F1A4C9160003BDF21 /* FOXThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B0A9C1A4C9160003BDF21 /* FOXThread.h */; }; + 1F7B0AA01A4C9160003BDF21 /* FOXThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B0A9D1A4C9160003BDF21 /* FOXThread.m */; }; + 1F7B0AA11A4C9160003BDF21 /* FOXThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B0A9D1A4C9160003BDF21 /* FOXThread.m */; }; + 1F7B0AA41A4CC797003BDF21 /* FOXMemory.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B0AA21A4CC797003BDF21 /* FOXMemory.h */; }; + 1F7B0AA51A4CC797003BDF21 /* FOXMemory.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B0AA21A4CC797003BDF21 /* FOXMemory.h */; }; + 1F7B0AA61A4CC797003BDF21 /* FOXMemory.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B0AA31A4CC797003BDF21 /* FOXMemory.m */; }; + 1F7B0AA71A4CC797003BDF21 /* FOXMemory.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B0AA31A4CC797003BDF21 /* FOXMemory.m */; }; + 1F7B796F1A646BB000BA47A4 /* FOXAssertionException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */; }; + 1F7B79701A646BB000BA47A4 /* FOXAssertionException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */; }; + 1F7B79711A646BB000BA47A4 /* FOXAssertionException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */; }; + 1F7B79721A646BB000BA47A4 /* FOXAssertionException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */; }; + 1F7CF6641A3FD7FF005C86A5 /* NSArray+FastEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F59A81C196E900B00957FAA /* NSArray+FastEnumerator.m */; }; + 1F7CF6661A3FD7FF005C86A5 /* Queue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F5018891991D37A001AB3A9 /* Queue.m */; }; + 1F7CF6681A3FD7FF005C86A5 /* QueueAddTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B73029745CB5B325095CB3 /* QueueAddTransition.m */; }; + 1F7CF66A1A3FD7FF005C86A5 /* QueueRemoveTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B73BE31D123C54907C7EE3 /* QueueRemoveTransition.m */; }; + 1F7CF66C1A3FD7FF005C86A5 /* FOXSpecHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBF91988B4BA0059D31A /* FOXSpecHelper.m */; }; + 1F7CF66E1A3FD7FF005C86A5 /* Ticker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA6E1A3EC8480000E69E /* Ticker.m */; }; + 1F7CF66F1A3FD7FF005C86A5 /* FOXRandomSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC471990CB6400BEA6E1 /* FOXRandomSpec.mm */; }; + 1F7CF6701A3FD7FF005C86A5 /* FOXSequenceSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F61E455196E8AEF003EA164 /* FOXSequenceSpec.mm */; }; + 1F7CF6711A3FD7FF005C86A5 /* FOXRoseTreeSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC36198F78C200BEA6E1 /* FOXRoseTreeSpec.mm */; }; + 1F7CF6721A3FD7FF005C86A5 /* FOXAnyObjectSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4FC1A3147570017E81A /* FOXAnyObjectSpec.mm */; }; + 1F7CF6731A3FD7FF005C86A5 /* FOXArraySpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F848B481977B8F100F0966E /* FOXArraySpec.mm */; }; + 1F7CF6741A3FD7FF005C86A5 /* FOXBindSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FC42D471A34E8E8006455F2 /* FOXBindSpec.mm */; }; + 1F7CF6751A3FD7FF005C86A5 /* FOXCharacterSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC33198DF77400BEA6E1 /* FOXCharacterSpec.mm */; }; + 1F7CF6761A3FD7FF005C86A5 /* FOXChooseSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC30198DF48A00BEA6E1 /* FOXChooseSpec.mm */; }; + 1F7CF6771A3FD7FF005C86A5 /* FOXDecimalNumberSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F2C101B1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm */; }; + 1F7CF6781A3FD7FF005C86A5 /* FOXDictionarySpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBFF1989FE530059D31A /* FOXDictionarySpec.mm */; }; + 1F7CF6791A3FD7FF005C86A5 /* FOXDoubleSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F6A7DD91A35241700EA3482 /* FOXDoubleSpec.mm */; }; + 1F7CF67A1A3FD7FF005C86A5 /* FOXFiniteStateMachineSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F50188C1991D406001AB3A9 /* FOXFiniteStateMachineSpec.mm */; }; + 1F7CF67B1A3FD7FF005C86A5 /* FOXFloatSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B6D1A2F10080011838A /* FOXFloatSpec.mm */; }; + 1F7CF67C1A3FD7FF005C86A5 /* FOXFrequencySpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4F31A313C720017E81A /* FOXFrequencySpec.mm */; }; + 1F7CF67D1A3FD7FF005C86A5 /* FOXGenericSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F6C41241A14736F003B6C83 /* FOXGenericSpec.mm */; }; + 1F7CF67E1A3FD7FF005C86A5 /* FOXIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FF5B93519737D4600416383 /* FOXIntegerSpec.mm */; }; + 1F7CF67F1A3FD7FF005C86A5 /* FOXNegativeIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F848B4419779F6600F0966E /* FOXNegativeIntegerSpec.mm */; }; + 1F7CF6801A3FD7FF005C86A5 /* FOXOptionalSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4F61A3140070017E81A /* FOXOptionalSpec.mm */; }; + 1F7CF6811A3FD7FF005C86A5 /* FOXPositiveIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F848B411977965500F0966E /* FOXPositiveIntegerSpec.mm */; }; + 1F7CF6821A3FD7FF005C86A5 /* FOXResizeSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F71D4F91A3143A70017E81A /* FOXResizeSpec.mm */; }; + 1F7CF6831A3FD7FF005C86A5 /* FOXReturnSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F61E44F196E88A6003EA164 /* FOXReturnSpec.mm */; }; + 1F7CF6841A3FD7FF005C86A5 /* FOXSetSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDBFC1989F9DD0059D31A /* FOXSetSpec.mm */; }; + 1F7CF6851A3FD7FF005C86A5 /* FOXStringSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FDC021989FED70059D31A /* FOXStringSpec.mm */; }; + 1F7CF6861A3FD7FF005C86A5 /* FOXSuchThatSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FA94A35199606F800803AF3 /* FOXSuchThatSpec.mm */; }; + 1F7CF6871A3FD7FF005C86A5 /* FOXTupleGeneratorSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F35BC2D198DB6AA00BEA6E1 /* FOXTupleGeneratorSpec.mm */; }; + 1F7CF6881A3FD7FF005C86A5 /* FOXParallelStateMachineSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56A21A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm */; }; + 1F7CF6891A3FD7FF005C86A5 /* FOXAlwaysSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA711A3F97650000E69E /* FOXAlwaysSpec.mm */; }; + 1F7CF68A1A3FD7FF005C86A5 /* FOXPropertySpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 31B73C759823AC30AE97B012 /* FOXPropertySpec.mm */; }; + 1F7CF68B1A3FD806005C86A5 /* Cedar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FF4AA871A3FD6AA0000E69E /* Cedar.framework */; }; + 1F7CF68C1A3FD80A005C86A5 /* Fox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F41BE901A2ACB9C00F25A65 /* Fox.framework */; }; + 1F7CF6AD1A3FF146005C86A5 /* FOXDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7CF6AB1A3FF146005C86A5 /* FOXDictionary.h */; }; + 1F7CF6AE1A3FF146005C86A5 /* FOXDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7CF6AB1A3FF146005C86A5 /* FOXDictionary.h */; }; + 1F7CF6AF1A3FF146005C86A5 /* FOXDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7CF6AC1A3FF146005C86A5 /* FOXDictionary.m */; }; + 1F7CF6B01A3FF146005C86A5 /* FOXDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7CF6AC1A3FF146005C86A5 /* FOXDictionary.m */; }; + 1F7CF6B31A3FF513005C86A5 /* FOXStringUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7CF6B11A3FF513005C86A5 /* FOXStringUtil.h */; }; + 1F7CF6B41A3FF513005C86A5 /* FOXStringUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7CF6B11A3FF513005C86A5 /* FOXStringUtil.h */; }; + 1F7CF6B51A3FF513005C86A5 /* FOXStringUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7CF6B21A3FF513005C86A5 /* FOXStringUtil.m */; }; + 1F7CF6B61A3FF513005C86A5 /* FOXStringUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F7CF6B21A3FF513005C86A5 /* FOXStringUtil.m */; }; + 1F97E1CC1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */; }; + 1F97E1CD1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */; }; + 1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; }; + 1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; }; + 1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; }; + 1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; }; + 1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; }; + 1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; }; + 1F9E645A1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F9E645B1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F9E645C1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; }; + 1F9E645D1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; }; + 1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; }; + 1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; }; + 1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; }; + 1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; }; 1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; }; 1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; }; 1FAE3B681A2EC5E60011838A /* SwiftGenerators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */; }; @@ -264,6 +406,33 @@ 1FFCE56D1A81DF8300A427AA /* FOXStrictPositiveIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FFCE56B1A81DF8300A427AA /* FOXStrictPositiveIntegerSpec.mm */; }; 1FFCE56F1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FFCE56E1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm */; }; 1FFCE5701A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FFCE56E1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm */; }; + 1FCE1B251A4570D500902226 /* FOXLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FCE1B231A4570D500902226 /* FOXLogging.h */; }; + 1FCE1B261A4570D500902226 /* FOXLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FCE1B231A4570D500902226 /* FOXLogging.h */; }; + 1FCE1B271A4570D500902226 /* FOXLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FCE1B241A4570D500902226 /* FOXLogging.m */; }; + 1FCE1B281A4570D500902226 /* FOXLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FCE1B241A4570D500902226 /* FOXLogging.m */; }; + 1FE168BB1A60AF5A0004734A /* TypedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE168BA1A60AF5A0004734A /* TypedData.swift */; }; + 1FE168BC1A60AF5A0004734A /* TypedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE168BA1A60AF5A0004734A /* TypedData.swift */; }; + 1FF0A7221A5F3F7300FA1B49 /* FOXScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF0A7201A5F3F7300FA1B49 /* FOXScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FF0A7231A5F3F7300FA1B49 /* FOXScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF0A7201A5F3F7300FA1B49 /* FOXScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FF0A7241A5F3F7300FA1B49 /* FOXScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF0A7211A5F3F7300FA1B49 /* FOXScheduler.m */; }; + 1FF0A7251A5F3F7300FA1B49 /* FOXScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF0A7211A5F3F7300FA1B49 /* FOXScheduler.m */; }; + 1FF0A7281A5F43C200FA1B49 /* FOXExecutedProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF0A7261A5F43C200FA1B49 /* FOXExecutedProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FF0A7291A5F43C200FA1B49 /* FOXExecutedProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF0A7261A5F43C200FA1B49 /* FOXExecutedProgram.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FF0A72A1A5F43C200FA1B49 /* FOXExecutedProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF0A7271A5F43C200FA1B49 /* FOXExecutedProgram.m */; }; + 1FF0A72B1A5F43C200FA1B49 /* FOXExecutedProgram.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF0A7271A5F43C200FA1B49 /* FOXExecutedProgram.m */; }; + 1FF4AA6F1A3EC8480000E69E /* Ticker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA6E1A3EC8480000E69E /* Ticker.m */; }; + 1FF4AA701A3EC8480000E69E /* Ticker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA6E1A3EC8480000E69E /* Ticker.m */; }; + 1FF4AA721A3F97650000E69E /* FOXAlwaysSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA711A3F97650000E69E /* FOXAlwaysSpec.mm */; }; + 1FF4AA731A3F97650000E69E /* FOXAlwaysSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AA711A3F97650000E69E /* FOXAlwaysSpec.mm */; }; + 1FF4AAB31A3FD7C10000E69E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF4AAB21A3FD7C10000E69E /* main.m */; }; + 1FF679281A5E8EC6004F54DA /* FOXBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF679261A5E8EC6004F54DA /* FOXBlock.h */; }; + 1FF679291A5E8EC6004F54DA /* FOXBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF679261A5E8EC6004F54DA /* FOXBlock.h */; }; + 1FF6792A1A5E8EC6004F54DA /* FOXBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF679271A5E8EC6004F54DA /* FOXBlock.m */; }; + 1FF6792B1A5E8EC6004F54DA /* FOXBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF679271A5E8EC6004F54DA /* FOXBlock.m */; }; + 31B7348EC23DF7619297D32A /* FOXRaiseResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B73EA2382908451AE4D001 /* FOXRaiseResult.m */; }; + 31B739BC14CFC82EFCCCD877 /* FOXRaiseResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B7390300512045CECFB005 /* FOXRaiseResult.h */; }; + 31B73ABA3078C6B3B2E2CF7C /* FOXRaiseResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 31B7390300512045CECFB005 /* FOXRaiseResult.h */; }; + 31B73D3CD71E35249F44DA0F /* FOXRaiseResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B73EA2382908451AE4D001 /* FOXRaiseResult.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -281,12 +450,46 @@ remoteGlobalIDString = 1F41BEAD1A2ACBA300F25A65; remoteInfo = "Fox-iOS"; }; + 1F7CF6601A3FD7EC005C86A5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1F6016041919DCE0003D8484 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1F41BE8F1A2ACB9C00F25A65; + remoteInfo = "Fox-OSX"; + }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 1FF4AAAE1A3FD7C10000E69E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + 1F13AD6F1A60990C00DD65C6 /* FOXProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXProgram.h; path = Fox/Public/Data/FOXProgram.h; sourceTree = SOURCE_ROOT; }; + 1F13AD701A60990C00DD65C6 /* FOXProgram.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXProgram.m; path = Fox/Public/Data/FOXProgram.m; sourceTree = SOURCE_ROOT; }; + 1F17D5451A3BF17D00E1BB60 /* FOXInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXInstrumentation.h; sourceTree = ""; }; + 1F17D5461A3BF17D00E1BB60 /* FOXInstrumentation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXInstrumentation.m; sourceTree = ""; }; + 1F18C08F1A403836000C7EA6 /* FOXRoseTree+Protected.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "FOXRoseTree+Protected.h"; path = "Fox/Private/Data/FOXRoseTree+Protected.h"; sourceTree = SOURCE_ROOT; }; 1F2A94F41997383300471B24 /* FOXTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXTransition.h; sourceTree = ""; }; 1F2A94F51997383300471B24 /* FOXTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXTransition.m; sourceTree = ""; }; 1F2C101B1A3784B900BF6AEC /* FOXDecimalNumberSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXDecimalNumberSpec.mm; path = FoxSpecs/Public/Generators/FOXDecimalNumberSpec.mm; sourceTree = SOURCE_ROOT; }; + 1F2E36291A6BAA93009799D0 /* FOXArraySequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXArraySequence.h; path = Fox/Private/Data/FOXArraySequence.h; sourceTree = SOURCE_ROOT; }; + 1F2E362A1A6BAA93009799D0 /* FOXArraySequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXArraySequence.m; path = Fox/Private/Data/FOXArraySequence.m; sourceTree = SOURCE_ROOT; }; + 1F2E362B1A6BAA93009799D0 /* FOXRepeatedSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXRepeatedSequence.h; path = Fox/Private/Data/FOXRepeatedSequence.h; sourceTree = SOURCE_ROOT; }; + 1F2E362C1A6BAA93009799D0 /* FOXRepeatedSequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXRepeatedSequence.m; path = Fox/Private/Data/FOXRepeatedSequence.m; sourceTree = SOURCE_ROOT; }; + 1F2E36361A6C546B009799D0 /* FOXCyclicRandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXCyclicRandom.h; sourceTree = ""; }; + 1F2E36371A6C546B009799D0 /* FOXCyclicRandom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXCyclicRandom.m; sourceTree = ""; }; + 1F2E363C1A6C5476009799D0 /* FOXSequenceRandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSequenceRandom.h; sourceTree = ""; }; + 1F2E363D1A6C5476009799D0 /* FOXSequenceRandom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXSequenceRandom.m; sourceTree = ""; }; + 1F2F02231A3E8C090039D3B3 /* FOXMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXMath.h; path = Fox/Private/FOXMath.h; sourceTree = SOURCE_ROOT; }; + 1F2F02241A3E8C090039D3B3 /* FOXMath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXMath.m; path = Fox/Private/FOXMath.m; sourceTree = SOURCE_ROOT; }; 1F35BC1D198D824600BEA6E1 /* FOXNamedGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXNamedGenerator.h; sourceTree = ""; }; 1F35BC1E198D824600BEA6E1 /* FOXNamedGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXNamedGenerator.m; sourceTree = ""; }; 1F35BC21198D838300BEA6E1 /* FOXStringGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXStringGenerator.h; sourceTree = ""; }; @@ -327,6 +530,11 @@ 1F46E51B198CB78000F87028 /* FOXChooseGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXChooseGenerator.m; sourceTree = ""; }; 1F46E51E198CBAF100F87028 /* FOXSequenceGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSequenceGenerator.h; sourceTree = ""; }; 1F46E51F198CBAF100F87028 /* FOXSequenceGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXSequenceGenerator.m; sourceTree = ""; }; + 1F4A56A21A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXParallelStateMachineSpec.mm; path = FoxSpecs/Public/Generators/FOXParallelStateMachineSpec.mm; sourceTree = SOURCE_ROOT; }; + 1F4A56A51A3B4CE9009E1637 /* FOXStateMachineGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXStateMachineGenerator.h; path = Fox/Private/Generators/FOXStateMachineGenerator.h; sourceTree = SOURCE_ROOT; }; + 1F4A56A61A3B4CE9009E1637 /* FOXStateMachineGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXStateMachineGenerator.m; path = Fox/Private/Generators/FOXStateMachineGenerator.m; sourceTree = SOURCE_ROOT; }; + 1F4A57211A3BB73C009E1637 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/CoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 1F4A57231A3BB742009E1637 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 1F4CA2CC1A2D747300989740 /* Cedar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cedar.framework; path = Externals/cedar/build/Debug/Cedar.framework; sourceTree = ""; }; 1F4CA2CE1A2D747700989740 /* libCedar-StaticLib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libCedar-StaticLib.a"; path = "Externals/cedar/build/Debug-iphoneos/libCedar-StaticLib.a"; sourceTree = ""; }; 1F5018881991D37A001AB3A9 /* Queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Queue.h; sourceTree = ""; }; @@ -348,6 +556,23 @@ 1F6C41241A14736F003B6C83 /* FOXGenericSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXGenericSpec.mm; sourceTree = ""; }; 1F6C41281A147B3D003B6C83 /* FOXDSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXDSL.h; sourceTree = ""; }; 1F6C41291A147B3D003B6C83 /* FOXDSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXDSL.m; sourceTree = ""; }; + 1F6DE1631A4F66F900C93B28 /* decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode.c; sourceTree = ""; }; + 1F6DE1641A4F66F900C93B28 /* decode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decode.h; sourceTree = ""; }; + 1F6DE1651A4F66F900C93B28 /* extern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extern.h; sourceTree = ""; }; + 1F6DE1661A4F66F900C93B28 /* input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = input.c; sourceTree = ""; }; + 1F6DE1671A4F66F900C93B28 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 1F6DE1681A4F66F900C93B28 /* itab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = itab.c; sourceTree = ""; }; + 1F6DE1691A4F66F900C93B28 /* itab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = itab.h; sourceTree = ""; }; + 1F6DE16A1A4F66F900C93B28 /* syn-att.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "syn-att.c"; sourceTree = ""; }; + 1F6DE16B1A4F66F900C93B28 /* syn-intel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "syn-intel.c"; sourceTree = ""; }; + 1F6DE16C1A4F66F900C93B28 /* syn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = syn.c; sourceTree = ""; }; + 1F6DE16D1A4F66F900C93B28 /* syn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syn.h; sourceTree = ""; }; + 1F6DE16E1A4F66F900C93B28 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; + 1F6DE16F1A4F66F900C93B28 /* udint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udint.h; sourceTree = ""; }; + 1F6DE1701A4F66F900C93B28 /* udis86.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = udis86.c; sourceTree = ""; }; + 1F6DE1711A4F66F900C93B28 /* mach_override.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mach_override.c; sourceTree = ""; }; + 1F6DE1721A4F66F900C93B28 /* mach_override.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mach_override.h; sourceTree = ""; }; + 1F6DE1731A4F66F900C93B28 /* udis86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udis86.h; sourceTree = ""; }; 1F71D4E71A3105050017E81A /* FOXEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXEnvironment.h; path = Fox/Public/FOXEnvironment.h; sourceTree = SOURCE_ROOT; }; 1F71D4E81A3105050017E81A /* FOXEnvironment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXEnvironment.m; path = Fox/Public/FOXEnvironment.m; sourceTree = SOURCE_ROOT; }; 1F71D4ED1A3105520017E81A /* FOXDebugging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXDebugging.h; path = Fox/Public/FOXDebugging.h; sourceTree = SOURCE_ROOT; }; @@ -356,6 +581,16 @@ 1F71D4F61A3140070017E81A /* FOXOptionalSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXOptionalSpec.mm; path = FoxSpecs/Public/Generators/FOXOptionalSpec.mm; sourceTree = SOURCE_ROOT; }; 1F71D4F91A3143A70017E81A /* FOXResizeSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXResizeSpec.mm; path = FoxSpecs/Public/Generators/FOXResizeSpec.mm; sourceTree = SOURCE_ROOT; }; 1F71D4FC1A3147570017E81A /* FOXAnyObjectSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXAnyObjectSpec.mm; path = FoxSpecs/Public/Generators/FOXAnyObjectSpec.mm; sourceTree = SOURCE_ROOT; }; + 1F7B0A9C1A4C9160003BDF21 /* FOXThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXThread.h; sourceTree = ""; }; + 1F7B0A9D1A4C9160003BDF21 /* FOXThread.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXThread.m; sourceTree = ""; }; + 1F7B0AA21A4CC797003BDF21 /* FOXMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXMemory.h; path = Fox/Private/FOXMemory.h; sourceTree = SOURCE_ROOT; }; + 1F7B0AA31A4CC797003BDF21 /* FOXMemory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXMemory.m; path = Fox/Private/FOXMemory.m; sourceTree = SOURCE_ROOT; }; + 1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXAssertionException.h; path = Fox/Private/Data/FOXAssertionException.h; sourceTree = SOURCE_ROOT; }; + 1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXAssertionException.m; path = Fox/Private/Data/FOXAssertionException.m; sourceTree = SOURCE_ROOT; }; + 1F7CF6AB1A3FF146005C86A5 /* FOXDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXDictionary.h; path = Fox/Private/Data/FOXDictionary.h; sourceTree = SOURCE_ROOT; }; + 1F7CF6AC1A3FF146005C86A5 /* FOXDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXDictionary.m; path = Fox/Private/Data/FOXDictionary.m; sourceTree = SOURCE_ROOT; }; + 1F7CF6B11A3FF513005C86A5 /* FOXStringUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXStringUtil.h; path = Fox/Private/FOXStringUtil.h; sourceTree = SOURCE_ROOT; }; + 1F7CF6B21A3FF513005C86A5 /* FOXStringUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXStringUtil.m; path = Fox/Private/FOXStringUtil.m; sourceTree = SOURCE_ROOT; }; 1F848B411977965500F0966E /* FOXPositiveIntegerSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = FOXPositiveIntegerSpec.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 1F848B4419779F6600F0966E /* FOXNegativeIntegerSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = FOXNegativeIntegerSpec.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 1F848B471977A75200F0966E /* FOXMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FOXMacros.h; sourceTree = ""; }; @@ -371,16 +606,40 @@ 1F8FDBFC1989F9DD0059D31A /* FOXSetSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXSetSpec.mm; sourceTree = ""; }; 1F8FDBFF1989FE530059D31A /* FOXDictionarySpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXDictionarySpec.mm; sourceTree = ""; }; 1F8FDC021989FED70059D31A /* FOXStringSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXStringSpec.mm; sourceTree = ""; }; + 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXThreadMachine.h; sourceTree = ""; }; + 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXThreadMachine.m; sourceTree = ""; }; + 1F9926981A410A9A009840BF /* libffi.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libffi.dylib; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libffi.dylib; sourceTree = DEVELOPER_DIR; }; 1F9BA1901A11CFA90053B3C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1F9BDD9519EA501500BAF25E /* FOXExecutedCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXExecutedCommand.h; sourceTree = ""; }; 1F9BDD9619EA501500BAF25E /* FOXExecutedCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXExecutedCommand.m; sourceTree = ""; }; + 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "FOXRunnerResult+Protected.h"; path = "Fox/Private/Data/FOXRunnerResult+Protected.h"; sourceTree = SOURCE_ROOT; }; + 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "FOXRunnerResult+Protected.m"; path = "Fox/Private/Data/FOXRunnerResult+Protected.m"; sourceTree = SOURCE_ROOT; }; + 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXParallelGenerators.h; path = Fox/Public/Generators/FOXParallelGenerators.h; sourceTree = SOURCE_ROOT; }; + 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXParallelGenerators.m; path = Fox/Public/Generators/FOXParallelGenerators.m; sourceTree = SOURCE_ROOT; }; 1FA94A35199606F800803AF3 /* FOXSuchThatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXSuchThatSpec.mm; sourceTree = ""; }; 1FA94A38199609D000803AF3 /* FOXSuchThatGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSuchThatGenerator.h; sourceTree = ""; }; 1FA94A39199609D000803AF3 /* FOXSuchThatGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXSuchThatGenerator.m; sourceTree = ""; }; + 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXObjectiveCRepresentation.h; path = Fox/Private/Data/FOXObjectiveCRepresentation.h; sourceTree = SOURCE_ROOT; }; + 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXObjectiveCRepresentation.m; path = Fox/Private/Data/FOXObjectiveCRepresentation.m; sourceTree = SOURCE_ROOT; }; 1FAE3B5B1A2EC1000011838A /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Fox/Public/DSL.swift; sourceTree = SOURCE_ROOT; }; 1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftGenerators.swift; path = Fox/Public/Generators/SwiftGenerators.swift; sourceTree = SOURCE_ROOT; }; 1FAE3B6D1A2F10080011838A /* FOXFloatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXFloatSpec.mm; path = FoxSpecs/Public/Generators/FOXFloatSpec.mm; sourceTree = SOURCE_ROOT; }; 1FC42D471A34E8E8006455F2 /* FOXBindSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXBindSpec.mm; path = FoxSpecs/Public/Generators/FOXBindSpec.mm; sourceTree = SOURCE_ROOT; }; + 1FCE1B231A4570D500902226 /* FOXLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXLogging.h; path = Fox/Private/FOXLogging.h; sourceTree = SOURCE_ROOT; }; + 1FCE1B241A4570D500902226 /* FOXLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXLogging.m; path = Fox/Private/FOXLogging.m; sourceTree = SOURCE_ROOT; }; + 1FE168BA1A60AF5A0004734A /* TypedData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TypedData.swift; path = Fox/Public/Data/TypedData.swift; sourceTree = SOURCE_ROOT; }; + 1FF011E91A48AAAC001BC70F /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Kernel.framework; sourceTree = DEVELOPER_DIR; }; + 1FF011EB1A48AB32001BC70F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; + 1FF0A7201A5F3F7300FA1B49 /* FOXScheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXScheduler.h; path = Fox/Public/FOXScheduler.h; sourceTree = SOURCE_ROOT; }; + 1FF0A7211A5F3F7300FA1B49 /* FOXScheduler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXScheduler.m; path = Fox/Public/FOXScheduler.m; sourceTree = SOURCE_ROOT; }; + 1FF0A7261A5F43C200FA1B49 /* FOXExecutedProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXExecutedProgram.h; path = Fox/Public/Data/FOXExecutedProgram.h; sourceTree = SOURCE_ROOT; }; + 1FF0A7271A5F43C200FA1B49 /* FOXExecutedProgram.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXExecutedProgram.m; path = Fox/Public/Data/FOXExecutedProgram.m; sourceTree = SOURCE_ROOT; }; + 1FF4AA6D1A3EC8480000E69E /* Ticker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Ticker.h; path = FoxSpecs/Helpers/Ticker.h; sourceTree = SOURCE_ROOT; }; + 1FF4AA6E1A3EC8480000E69E /* Ticker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Ticker.m; path = FoxSpecs/Helpers/Ticker.m; sourceTree = SOURCE_ROOT; }; + 1FF4AA711A3F97650000E69E /* FOXAlwaysSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXAlwaysSpec.mm; path = FoxSpecs/Public/Generators/FOXAlwaysSpec.mm; sourceTree = SOURCE_ROOT; }; + 1FF4AA871A3FD6AA0000E69E /* Cedar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cedar.framework; path = "../../Library/Developer/Xcode/DerivedData/Fox-dmobuslqyltucubgnxyazjnfmyjr/Build/Products/Debug/Cedar.framework"; sourceTree = ""; }; + 1FF4AAB01A3FD7C10000E69E /* Fox-OSX-Specs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Fox-OSX-Specs"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FF4AAB21A3FD7C10000E69E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 1FF5B93519737D4600416383 /* FOXIntegerSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = FOXIntegerSpec.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 1FF5B93C1973BD9000416383 /* FOXRoseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXRoseTree.h; sourceTree = ""; }; 1FF5B93D1973BD9000416383 /* FOXRoseTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXRoseTree.m; sourceTree = ""; }; @@ -389,6 +648,8 @@ 1FFCE5661A80B90700A427AA /* FOXLimits.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXLimits.mm; path = Fox/Private/FOXLimits.mm; sourceTree = SOURCE_ROOT; }; 1FFCE56B1A81DF8300A427AA /* FOXStrictPositiveIntegerSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXStrictPositiveIntegerSpec.mm; path = FoxSpecs/Public/Generators/FOXStrictPositiveIntegerSpec.mm; sourceTree = SOURCE_ROOT; }; 1FFCE56E1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXStrictNegativeIntegerSpec.mm; path = FoxSpecs/Public/Generators/FOXStrictNegativeIntegerSpec.mm; sourceTree = SOURCE_ROOT; }; + 1FF679261A5E8EC6004F54DA /* FOXBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXBlock.h; path = Fox/Private/Data/FOXBlock.h; sourceTree = SOURCE_ROOT; }; + 1FF679271A5E8EC6004F54DA /* FOXBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXBlock.m; path = Fox/Private/Data/FOXBlock.m; sourceTree = SOURCE_ROOT; }; 31B730183A626AD19A2B366E /* FOXSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSequence.h; sourceTree = ""; }; 31B73029745CB5B325095CB3 /* QueueAddTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QueueAddTransition.m; sourceTree = ""; }; 31B7303EEEA0827C94541FB4 /* FOXStateMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXStateMachine.h; sourceTree = ""; }; @@ -403,9 +664,10 @@ 31B7359D19C07C6410676A13 /* FOXGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXGenerator.h; sourceTree = ""; }; 31B7367B3E11AD0DC06F6595 /* FOXDeterministicRandom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXDeterministicRandom.mm; sourceTree = ""; }; 31B736A7992BBD359C72E397 /* FOXCoreGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXCoreGenerators.h; sourceTree = ""; }; - 31B736F4E4E7DC1C8ACFC73A /* FOXArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXArray.m; sourceTree = ""; }; + 31B736F4E4E7DC1C8ACFC73A /* FOXPrettyArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXPrettyArray.m; sourceTree = ""; }; 31B73763F568C2CE1290B46F /* QueueRemoveTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QueueRemoveTransition.h; sourceTree = ""; }; - 31B73986A5F5236203E7B0F4 /* FOXArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXArray.h; sourceTree = ""; }; + 31B7390300512045CECFB005 /* FOXRaiseResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXRaiseResult.h; path = Fox/Private/Generators/FOXRaiseResult.h; sourceTree = SOURCE_ROOT; }; + 31B73986A5F5236203E7B0F4 /* FOXPrettyArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXPrettyArray.h; sourceTree = ""; }; 31B739B35946B2CB1FD5C6DC /* FOXReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXReporter.h; sourceTree = ""; }; 31B73AAAC1A903382CE73DC4 /* FOXStateMachineGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXStateMachineGenerators.m; sourceTree = ""; }; 31B73AC32A19CA6467FCB298 /* FOXPropertyResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXPropertyResult.h; sourceTree = ""; }; @@ -420,6 +682,7 @@ 31B73E4270D7E9BB43B88512 /* FOXStateTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXStateTransition.h; sourceTree = ""; }; 31B73E4FFE7B868F0EA1A6D3 /* FOXConstantRandom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXConstantRandom.m; sourceTree = ""; }; 31B73E65793C9A0F5F12FF3B /* FOXStringGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXStringGenerators.h; sourceTree = ""; }; + 31B73EA2382908451AE4D001 /* FOXRaiseResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXRaiseResult.m; path = Fox/Private/Generators/FOXRaiseResult.m; sourceTree = SOURCE_ROOT; }; 31B73F0233EF475592DC4F26 /* FOXNumericGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXNumericGenerators.m; sourceTree = ""; }; 31B73F20F954586E20BE9329 /* FOXStateMachineGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXStateMachineGenerators.h; sourceTree = ""; }; 31B73F4A43C962308369B5A9 /* FOXArrayGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXArrayGenerators.m; sourceTree = ""; }; @@ -435,6 +698,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1F4A57221A3BB73C009E1637 /* CoreServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -451,6 +715,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1F4A57241A3BB742009E1637 /* MobileCoreServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -464,9 +729,30 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1FF4AAAD1A3FD7C10000E69E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F7CF68C1A3FD80A005C86A5 /* Fox.framework in Frameworks */, + 1F7CF68B1A3FD806005C86A5 /* Cedar.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1F2E36351A6C546B009799D0 /* Random */ = { + isa = PBXGroup; + children = ( + 1F2E36361A6C546B009799D0 /* FOXCyclicRandom.h */, + 1F2E36371A6C546B009799D0 /* FOXCyclicRandom.m */, + 1F2E363C1A6C5476009799D0 /* FOXSequenceRandom.h */, + 1F2E363D1A6C5476009799D0 /* FOXSequenceRandom.m */, + ); + name = Random; + path = Fox/Private/Random; + sourceTree = SOURCE_ROOT; + }; 1F35BC3D1990CA3900BEA6E1 /* Reporters */ = { isa = PBXGroup; children = ( @@ -514,10 +800,28 @@ 1F35BC2A198D89DF00BEA6E1 /* FOXTupleGenerator.m */, 1FA94A38199609D000803AF3 /* FOXSuchThatGenerator.h */, 1FA94A39199609D000803AF3 /* FOXSuchThatGenerator.m */, + 1F4A56A51A3B4CE9009E1637 /* FOXStateMachineGenerator.h */, + 1F4A56A61A3B4CE9009E1637 /* FOXStateMachineGenerator.m */, + 31B73EA2382908451AE4D001 /* FOXRaiseResult.m */, + 31B7390300512045CECFB005 /* FOXRaiseResult.h */, ); path = Generators; sourceTree = ""; }; + 1F4A56AB1A3BAE79009E1637 /* Scheduler */ = { + isa = PBXGroup; + children = ( + 1F17D5451A3BF17D00E1BB60 /* FOXInstrumentation.h */, + 1F17D5461A3BF17D00E1BB60 /* FOXInstrumentation.m */, + 1F7B0A9C1A4C9160003BDF21 /* FOXThread.h */, + 1F7B0A9D1A4C9160003BDF21 /* FOXThread.m */, + 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */, + 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */, + ); + name = Scheduler; + path = ../../Fox/Private/Scheduler; + sourceTree = ""; + }; 1F59A819196E8FC000957FAA /* Helpers */ = { isa = PBXGroup; children = ( @@ -529,6 +833,8 @@ 31B73BE31D123C54907C7EE3 /* QueueRemoveTransition.m */, 1F8FDBF81988B4BA0059D31A /* FOXSpecHelper.h */, 1F8FDBF91988B4BA0059D31A /* FOXSpecHelper.m */, + 1FF4AA6D1A3EC8480000E69E /* Ticker.h */, + 1FF4AA6E1A3EC8480000E69E /* Ticker.m */, ); path = Helpers; sourceTree = ""; @@ -547,6 +853,7 @@ children = ( 1F6016111919DCE0003D8484 /* Fox */, 1F60164C1919DF90003D8484 /* FoxSpecs */, + 1FF4AAB11A3FD7C10000E69E /* Fox-OSX-Specs */, 1F60160E1919DCE0003D8484 /* Frameworks */, 1F60160D1919DCE0003D8484 /* Products */, ); @@ -559,6 +866,7 @@ 1F41BE9A1A2ACB9C00F25A65 /* Fox-OSXTests.xctest */, 1F41BEAE1A2ACBA300F25A65 /* Fox.framework */, 1F41BEB81A2ACBA300F25A65 /* Fox-iOSTests.xctest */, + 1FF4AAB01A3FD7C10000E69E /* Fox-OSX-Specs */, ); name = Products; sourceTree = ""; @@ -566,6 +874,12 @@ 1F60160E1919DCE0003D8484 /* Frameworks */ = { isa = PBXGroup; children = ( + 1FF011EB1A48AB32001BC70F /* IOKit.framework */, + 1FF011E91A48AAAC001BC70F /* Kernel.framework */, + 1F9926981A410A9A009840BF /* libffi.dylib */, + 1FF4AA871A3FD6AA0000E69E /* Cedar.framework */, + 1F4A57231A3BB742009E1637 /* MobileCoreServices.framework */, + 1F4A57211A3BB73C009E1637 /* CoreServices.framework */, 1F4CA2CE1A2D747700989740 /* libCedar-StaticLib.a */, 1F4CA2CC1A2D747300989740 /* Cedar.framework */, 1FF6737D1A2AC7E200F98D20 /* UIKit.framework */, @@ -606,6 +920,8 @@ 1F6016371919DD40003D8484 /* Generators */, 31B736A976CDB3B7301033AB /* Random */, 1F35BC3D1990CA3900BEA6E1 /* Reporters */, + 1FF0A7201A5F3F7300FA1B49 /* FOXScheduler.h */, + 1FF0A7211A5F3F7300FA1B49 /* FOXScheduler.m */, ); path = Public; sourceTree = ""; @@ -637,6 +953,8 @@ 1F6C41211A131D56003B6C83 /* FOXGenericGenerators.h */, 1F6C41221A131D56003B6C83 /* FOXGenericGenerators.m */, 1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */, + 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */, + 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */, ); path = Generators; sourceTree = ""; @@ -691,6 +1009,8 @@ 1F35BC2D198DB6AA00BEA6E1 /* FOXTupleGeneratorSpec.mm */, 1FFCE56B1A81DF8300A427AA /* FOXStrictPositiveIntegerSpec.mm */, 1FFCE56E1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm */, + 1F4A56A21A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm */, + 1FF4AA711A3F97650000E69E /* FOXAlwaysSpec.mm */, ); path = Generators; sourceTree = ""; @@ -704,13 +1024,57 @@ path = Data; sourceTree = ""; }; + 1F6DE1611A4F66B200C93B28 /* mach_override */ = { + isa = PBXGroup; + children = ( + 1F6DE1621A4F66F900C93B28 /* libudis86 */, + 1F6DE1711A4F66F900C93B28 /* mach_override.c */, + 1F6DE1721A4F66F900C93B28 /* mach_override.h */, + 1F6DE1731A4F66F900C93B28 /* udis86.h */, + ); + name = mach_override; + path = ../../Fox/Private/mach_override; + sourceTree = ""; + }; + 1F6DE1621A4F66F900C93B28 /* libudis86 */ = { + isa = PBXGroup; + children = ( + 1F6DE1631A4F66F900C93B28 /* decode.c */, + 1F6DE1641A4F66F900C93B28 /* decode.h */, + 1F6DE1651A4F66F900C93B28 /* extern.h */, + 1F6DE1661A4F66F900C93B28 /* input.c */, + 1F6DE1671A4F66F900C93B28 /* input.h */, + 1F6DE1681A4F66F900C93B28 /* itab.c */, + 1F6DE1691A4F66F900C93B28 /* itab.h */, + 1F6DE16A1A4F66F900C93B28 /* syn-att.c */, + 1F6DE16B1A4F66F900C93B28 /* syn-intel.c */, + 1F6DE16C1A4F66F900C93B28 /* syn.c */, + 1F6DE16D1A4F66F900C93B28 /* syn.h */, + 1F6DE16E1A4F66F900C93B28 /* types.h */, + 1F6DE16F1A4F66F900C93B28 /* udint.h */, + 1F6DE1701A4F66F900C93B28 /* udis86.c */, + ); + path = libudis86; + sourceTree = ""; + }; 1F8FDBE6198776FA0059D31A /* Private */ = { isa = PBXGroup; children = ( 1FFCE5651A80B90700A427AA /* FOXLimits.h */, 1FFCE5661A80B90700A427AA /* FOXLimits.mm */, + 1F2E36351A6C546B009799D0 /* Random */, + 1F6DE1611A4F66B200C93B28 /* mach_override */, + 1F4A56AB1A3BAE79009E1637 /* Scheduler */, 1F46E505198CAE6400F87028 /* Generators */, 1F8FDBE7198777080059D31A /* Data */, + 1F2F02231A3E8C090039D3B3 /* FOXMath.h */, + 1F2F02241A3E8C090039D3B3 /* FOXMath.m */, + 1F7CF6B11A3FF513005C86A5 /* FOXStringUtil.h */, + 1F7CF6B21A3FF513005C86A5 /* FOXStringUtil.m */, + 1FCE1B231A4570D500902226 /* FOXLogging.h */, + 1FCE1B241A4570D500902226 /* FOXLogging.m */, + 1F7B0AA21A4CC797003BDF21 /* FOXMemory.h */, + 1F7B0AA31A4CC797003BDF21 /* FOXMemory.m */, ); path = Private; sourceTree = ""; @@ -718,18 +1082,41 @@ 1F8FDBE7198777080059D31A /* Data */ = { isa = PBXGroup; children = ( + 1F2E36291A6BAA93009799D0 /* FOXArraySequence.h */, + 1F2E362A1A6BAA93009799D0 /* FOXArraySequence.m */, + 1F2E362B1A6BAA93009799D0 /* FOXRepeatedSequence.h */, + 1F2E362C1A6BAA93009799D0 /* FOXRepeatedSequence.m */, 1F8FDBE81987773F0059D31A /* FOXConcreteSequence.h */, 1F8FDBE91987773F0059D31A /* FOXConcreteSequence.m */, 1F8FDBEA1987773F0059D31A /* FOXLazySequence.h */, 1F8FDBEB1987773F0059D31A /* FOXLazySequence.m */, 1F8FDBF0198777540059D31A /* FOXSequenceEnumerator.h */, 1F8FDBF1198777540059D31A /* FOXSequenceEnumerator.m */, - 31B73986A5F5236203E7B0F4 /* FOXArray.h */, - 31B736F4E4E7DC1C8ACFC73A /* FOXArray.m */, + 31B73986A5F5236203E7B0F4 /* FOXPrettyArray.h */, + 31B736F4E4E7DC1C8ACFC73A /* FOXPrettyArray.m */, + 1F7CF6AB1A3FF146005C86A5 /* FOXDictionary.h */, + 1F7CF6AC1A3FF146005C86A5 /* FOXDictionary.m */, + 1F18C08F1A403836000C7EA6 /* FOXRoseTree+Protected.h */, + 1FF679261A5E8EC6004F54DA /* FOXBlock.h */, + 1FF679271A5E8EC6004F54DA /* FOXBlock.m */, + 1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */, + 1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */, + 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */, + 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */, + 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */, + 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */, ); path = Data; sourceTree = ""; }; + 1FF4AAB11A3FD7C10000E69E /* Fox-OSX-Specs */ = { + isa = PBXGroup; + children = ( + 1FF4AAB21A3FD7C10000E69E /* main.m */, + ); + path = "Fox-OSX-Specs"; + sourceTree = ""; + }; 31B736A976CDB3B7301033AB /* Random */ = { isa = PBXGroup; children = ( @@ -759,6 +1146,11 @@ 31B733ACE038CF303D9ECC27 /* FOXSequence.m */, 1F2A94F41997383300471B24 /* FOXTransition.h */, 1F2A94F51997383300471B24 /* FOXTransition.m */, + 1FF0A7261A5F43C200FA1B49 /* FOXExecutedProgram.h */, + 1FF0A7271A5F43C200FA1B49 /* FOXExecutedProgram.m */, + 1F13AD6F1A60990C00DD65C6 /* FOXProgram.h */, + 1F13AD701A60990C00DD65C6 /* FOXProgram.m */, + 1FE168BA1A60AF5A0004734A /* TypedData.swift */, ); path = Data; sourceTree = ""; @@ -771,54 +1163,85 @@ buildActionMask = 2147483647; files = ( 1F38B6311A2ACCA80078FF90 /* FOXSuchThatGenerator.h in Headers */, + 1F9E645A1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */, 1F38B6A81A2ACCC00078FF90 /* FOXCoreGenerators.h in Headers */, 1F38B6B51A2ACCC00078FF90 /* FOXStateMachine.h in Headers */, 1F38B6A21A2ACCC00078FF90 /* FOXSequence.h in Headers */, 1F38B64F1A2ACCAE0078FF90 /* FOXSequenceEnumerator.h in Headers */, + 1F17D5471A3BF17D00E1BB60 /* FOXInstrumentation.h in Headers */, 1F38B6AC1A2ACCC00078FF90 /* FOXFiniteStateMachine.h in Headers */, + 1FF679281A5E8EC6004F54DA /* FOXBlock.h in Headers */, + 1F4A56A71A3B4CE9009E1637 /* FOXStateMachineGenerator.h in Headers */, 1F38B6B31A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */, 1F38B64D1A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */, 1F38B6271A2ACCA80078FF90 /* FOXPureGenerator.h in Headers */, + 1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */, 1F38B6C11A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */, 1F38B62D1A2ACCA80078FF90 /* FOXStringGenerator.h in Headers */, 1F38B6C61A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */, 1F38B6AA1A2ACCC00078FF90 /* FOXDictionaryGenerators.h in Headers */, + 1FF0A7221A5F3F7300FA1B49 /* FOXScheduler.h in Headers */, + 1F6DE1941A4F66F900C93B28 /* udis86.h in Headers */, 1F38B6CB1A2ACCC00078FF90 /* FOXDSL.h in Headers */, 1F38B6291A2ACCA80078FF90 /* FOXSequenceGenerator.h in Headers */, 1F38B69E1A2ACCC00078FF90 /* FOXRoseTree.h in Headers */, 1F38B6CA1A2ACCC00078FF90 /* FOXReporter.h in Headers */, + 1F6DE1881A4F66F900C93B28 /* syn.h in Headers */, 1F38B6AF1A2ACCC00078FF90 /* FOXNumericGenerators.h in Headers */, + 1F7B796F1A646BB000BA47A4 /* FOXAssertionException.h in Headers */, + 1FCE1B251A4570D500902226 /* FOXLogging.h in Headers */, + 1FF0A7281A5F43C200FA1B49 /* FOXExecutedProgram.h in Headers */, + 1F7CF6AD1A3FF146005C86A5 /* FOXDictionary.h in Headers */, 1F38B6BD1A2ACCC00078FF90 /* Fox.h in Headers */, 1F38B6981A2ACCC00078FF90 /* FOXCommand.h in Headers */, + 1F6DE1921A4F66F900C93B28 /* mach_override.h in Headers */, 1F38B6A61A2ACCC00078FF90 /* FOXArrayGenerators.h in Headers */, 1F38B61F1A2ACCA80078FF90 /* FOXBindGenerator.h in Headers */, + 1F7B0A9E1A4C9160003BDF21 /* FOXThread.h in Headers */, 1F38B62B1A2ACCA80078FF90 /* FOXSizedGenerator.h in Headers */, 1F38B6B61A2ACCC00078FF90 /* FOXStateMachineGenerators.h in Headers */, 1F38B69C1A2ACCC00078FF90 /* FOXPropertyResult.h in Headers */, + 1F6DE18A1A4F66F900C93B28 /* types.h in Headers */, 1F38B6BB1A2ACCC00078FF90 /* FOXGenericGenerators.h in Headers */, + 1F97E1CC1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */, + 1F2F02251A3E8C090039D3B3 /* FOXMath.h in Headers */, + 1F2E36311A6BAA93009799D0 /* FOXRepeatedSequence.h in Headers */, 1F38B61D1A2ACCA80078FF90 /* FOXArrayGenerator.h in Headers */, + 1F13AD711A60990C00DD65C6 /* FOXProgram.h in Headers */, 1F38B6231A2ACCA80078FF90 /* FOXMapGenerator.h in Headers */, + 1F6DE1781A4F66F900C93B28 /* extern.h in Headers */, 1F38B6C51A2ACCC00078FF90 /* FOXRandom.h in Headers */, + 1F2E36381A6C546B009799D0 /* FOXCyclicRandom.h in Headers */, + 1F6DE1761A4F66F900C93B28 /* decode.h in Headers */, 1F38B69A1A2ACCC00078FF90 /* FOXExecutedCommand.h in Headers */, + 1F6DE17C1A4F66F900C93B28 /* input.h in Headers */, + 1F2E363E1A6C5476009799D0 /* FOXSequenceRandom.h in Headers */, 1F38B6BE1A2ACCC00078FF90 /* FOXMacros.h in Headers */, + 1F2E362D1A6BAA93009799D0 /* FOXArraySequence.h in Headers */, + 1F7CF6B31A3FF513005C86A5 /* FOXStringUtil.h in Headers */, + 1F6DE1801A4F66F900C93B28 /* itab.h in Headers */, 1F71D4E91A3105050017E81A /* FOXEnvironment.h in Headers */, 1F38B61B1A2ACCA80078FF90 /* FOXBlockGenerator.h in Headers */, 1F71D4EF1A3105520017E81A /* FOXDebugging.h in Headers */, 1F38B6C81A2ACCC00078FF90 /* FOXStandardReporter.h in Headers */, + 1F6DE18C1A4F66F900C93B28 /* udint.h in Headers */, 1F38B6A41A2ACCC00078FF90 /* FOXTransition.h in Headers */, 1F38B64B1A2ACCAE0078FF90 /* FOXConcreteSequence.h in Headers */, 1F38B6B11A2ACCC00078FF90 /* FOXPropertyGenerators.h in Headers */, + 1F7B0AA41A4CC797003BDF21 /* FOXMemory.h in Headers */, 1F38B6251A2ACCA80078FF90 /* FOXNamedGenerator.h in Headers */, 1F38B6BF1A2ACCC00078FF90 /* FOXRunner.h in Headers */, 1F38B62F1A2ACCA80078FF90 /* FOXTupleGenerator.h in Headers */, 1F38B6B81A2ACCC00078FF90 /* FOXStateTransition.h in Headers */, 1F38B6AE1A2ACCC00078FF90 /* FOXGenerator.h in Headers */, - 1F38B6551A2ACCAE0078FF90 /* FOXArray.h in Headers */, + 1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */, + 1F38B6551A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */, 1F38B6211A2ACCA80078FF90 /* FOXChooseGenerator.h in Headers */, 1F38B6C31A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */, 1FFCE5671A80B90700A427AA /* FOXLimits.h in Headers */, 1F38B6A01A2ACCC00078FF90 /* FOXRunnerResult.h in Headers */, 1F38B6B91A2ACCC00078FF90 /* FOXStringGenerators.h in Headers */, + 31B739BC14CFC82EFCCCD877 /* FOXRaiseResult.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -827,54 +1250,85 @@ buildActionMask = 2147483647; files = ( 1F38B6491A2ACCA90078FF90 /* FOXSuchThatGenerator.h in Headers */, + 1F9E645B1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */, 1F38B6731A2ACCC00078FF90 /* FOXCoreGenerators.h in Headers */, 1F38B6801A2ACCC00078FF90 /* FOXStateMachine.h in Headers */, 1F38B66D1A2ACCC00078FF90 /* FOXSequence.h in Headers */, 1F38B65B1A2ACCAE0078FF90 /* FOXSequenceEnumerator.h in Headers */, + 1F17D5481A3BF17D00E1BB60 /* FOXInstrumentation.h in Headers */, 1F38B6771A2ACCC00078FF90 /* FOXFiniteStateMachine.h in Headers */, + 1FF679291A5E8EC6004F54DA /* FOXBlock.h in Headers */, + 1F4A56A81A3B4CE9009E1637 /* FOXStateMachineGenerator.h in Headers */, 1F38B67E1A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */, 1F38B6591A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */, 1F38B63F1A2ACCA90078FF90 /* FOXPureGenerator.h in Headers */, + 1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */, 1F38B68C1A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */, 1F38B6451A2ACCA90078FF90 /* FOXStringGenerator.h in Headers */, 1F38B6911A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */, 1F38B6751A2ACCC00078FF90 /* FOXDictionaryGenerators.h in Headers */, + 1FF0A7231A5F3F7300FA1B49 /* FOXScheduler.h in Headers */, + 1F6DE1951A4F66F900C93B28 /* udis86.h in Headers */, 1F38B6961A2ACCC00078FF90 /* FOXDSL.h in Headers */, 1F38B6411A2ACCA90078FF90 /* FOXSequenceGenerator.h in Headers */, 1F38B6691A2ACCC00078FF90 /* FOXRoseTree.h in Headers */, 1F38B6951A2ACCC00078FF90 /* FOXReporter.h in Headers */, + 1F6DE1891A4F66F900C93B28 /* syn.h in Headers */, 1F38B67A1A2ACCC00078FF90 /* FOXNumericGenerators.h in Headers */, + 1F7B79701A646BB000BA47A4 /* FOXAssertionException.h in Headers */, + 1FCE1B261A4570D500902226 /* FOXLogging.h in Headers */, + 1FF0A7291A5F43C200FA1B49 /* FOXExecutedProgram.h in Headers */, + 1F7CF6AE1A3FF146005C86A5 /* FOXDictionary.h in Headers */, 1F38B6881A2ACCC00078FF90 /* Fox.h in Headers */, 1F38B6631A2ACCC00078FF90 /* FOXCommand.h in Headers */, + 1F6DE1931A4F66F900C93B28 /* mach_override.h in Headers */, 1F38B6711A2ACCC00078FF90 /* FOXArrayGenerators.h in Headers */, 1F38B6371A2ACCA90078FF90 /* FOXBindGenerator.h in Headers */, + 1F7B0A9F1A4C9160003BDF21 /* FOXThread.h in Headers */, 1F38B6431A2ACCA90078FF90 /* FOXSizedGenerator.h in Headers */, 1F38B6811A2ACCC00078FF90 /* FOXStateMachineGenerators.h in Headers */, 1F38B6671A2ACCC00078FF90 /* FOXPropertyResult.h in Headers */, + 1F6DE18B1A4F66F900C93B28 /* types.h in Headers */, 1F38B6861A2ACCC00078FF90 /* FOXGenericGenerators.h in Headers */, + 1F97E1CD1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */, + 1F2F02261A3E8C090039D3B3 /* FOXMath.h in Headers */, + 1F2E36321A6BAA93009799D0 /* FOXRepeatedSequence.h in Headers */, 1F38B6351A2ACCA90078FF90 /* FOXArrayGenerator.h in Headers */, + 1F13AD721A60990C00DD65C6 /* FOXProgram.h in Headers */, 1F38B63B1A2ACCA90078FF90 /* FOXMapGenerator.h in Headers */, + 1F6DE1791A4F66F900C93B28 /* extern.h in Headers */, 1F38B6901A2ACCC00078FF90 /* FOXRandom.h in Headers */, + 1F2E36391A6C546B009799D0 /* FOXCyclicRandom.h in Headers */, + 1F6DE1771A4F66F900C93B28 /* decode.h in Headers */, 1F38B6651A2ACCC00078FF90 /* FOXExecutedCommand.h in Headers */, + 1F6DE17D1A4F66F900C93B28 /* input.h in Headers */, + 1F2E363F1A6C5476009799D0 /* FOXSequenceRandom.h in Headers */, 1F38B6891A2ACCC00078FF90 /* FOXMacros.h in Headers */, + 1F2E362E1A6BAA93009799D0 /* FOXArraySequence.h in Headers */, + 1F7CF6B41A3FF513005C86A5 /* FOXStringUtil.h in Headers */, + 1F6DE1811A4F66F900C93B28 /* itab.h in Headers */, 1F71D4EA1A3105050017E81A /* FOXEnvironment.h in Headers */, 1F38B6331A2ACCA90078FF90 /* FOXBlockGenerator.h in Headers */, 1F71D4F01A3105520017E81A /* FOXDebugging.h in Headers */, 1F38B6931A2ACCC00078FF90 /* FOXStandardReporter.h in Headers */, + 1F6DE18D1A4F66F900C93B28 /* udint.h in Headers */, 1F38B66F1A2ACCC00078FF90 /* FOXTransition.h in Headers */, 1F38B6571A2ACCAE0078FF90 /* FOXConcreteSequence.h in Headers */, 1F38B67C1A2ACCC00078FF90 /* FOXPropertyGenerators.h in Headers */, + 1F7B0AA51A4CC797003BDF21 /* FOXMemory.h in Headers */, 1F38B63D1A2ACCA90078FF90 /* FOXNamedGenerator.h in Headers */, 1F38B68A1A2ACCC00078FF90 /* FOXRunner.h in Headers */, 1F38B6471A2ACCA90078FF90 /* FOXTupleGenerator.h in Headers */, 1F38B6831A2ACCC00078FF90 /* FOXStateTransition.h in Headers */, 1F38B6791A2ACCC00078FF90 /* FOXGenerator.h in Headers */, - 1F38B6611A2ACCAE0078FF90 /* FOXArray.h in Headers */, + 1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */, + 1F38B6611A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */, 1F38B6391A2ACCA90078FF90 /* FOXChooseGenerator.h in Headers */, 1F38B68E1A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */, 1FFCE5681A80B90700A427AA /* FOXLimits.h in Headers */, 1F38B66B1A2ACCC00078FF90 /* FOXRunnerResult.h in Headers */, 1F38B6841A2ACCC00078FF90 /* FOXStringGenerators.h in Headers */, + 31B73ABA3078C6B3B2E2CF7C /* FOXRaiseResult.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -953,6 +1407,24 @@ productReference = 1F41BEB81A2ACBA300F25A65 /* Fox-iOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 1FF4AAAF1A3FD7C10000E69E /* Fox-OSX-Specs */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1FF4AAB41A3FD7C10000E69E /* Build configuration list for PBXNativeTarget "Fox-OSX-Specs" */; + buildPhases = ( + 1FF4AAAC1A3FD7C10000E69E /* Sources */, + 1FF4AAAD1A3FD7C10000E69E /* Frameworks */, + 1FF4AAAE1A3FD7C10000E69E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 1F7CF6611A3FD7EC005C86A5 /* PBXTargetDependency */, + ); + name = "Fox-OSX-Specs"; + productName = "Fox-OSX-Specs"; + productReference = 1FF4AAB01A3FD7C10000E69E /* Fox-OSX-Specs */; + productType = "com.apple.product-type.tool"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -976,6 +1448,9 @@ 1F41BEB71A2ACBA300F25A65 = { CreatedOnToolsVersion = 6.1; }; + 1FF4AAAF1A3FD7C10000E69E = { + CreatedOnToolsVersion = 6.1.1; + }; }; }; buildConfigurationList = 1F6016071919DCE0003D8484 /* Build configuration list for PBXProject "Fox" */; @@ -994,6 +1469,7 @@ 1F41BE991A2ACB9C00F25A65 /* Fox-OSXTests */, 1F41BEAD1A2ACBA300F25A65 /* Fox-iOS */, 1F41BEB71A2ACBA300F25A65 /* Fox-iOSTests */, + 1FF4AAAF1A3FD7C10000E69E /* Fox-OSX-Specs */, ); }; /* End PBXProject section */ @@ -1035,35 +1511,59 @@ buildActionMask = 2147483647; files = ( 1F38B6B41A2ACCC00078FF90 /* FOXSetGenerators.m in Sources */, + 1F7B0AA61A4CC797003BDF21 /* FOXMemory.m in Sources */, + 1F2E36331A6BAA93009799D0 /* FOXRepeatedSequence.m in Sources */, 1F38B6C41A2ACCC00078FF90 /* FOXDeterministicRandom.mm in Sources */, 1F38B64C1A2ACCAE0078FF90 /* FOXConcreteSequence.m in Sources */, 1F38B6AD1A2ACCC00078FF90 /* FOXFiniteStateMachine.m in Sources */, 1F38B6501A2ACCAE0078FF90 /* FOXSequenceEnumerator.m in Sources */, 1F38B6A11A2ACCC00078FF90 /* FOXRunnerResult.m in Sources */, + 1F6DE17A1A4F66F900C93B28 /* input.c in Sources */, 1F38B6301A2ACCA80078FF90 /* FOXTupleGenerator.m in Sources */, + 1F4A56A91A3B4CE9009E1637 /* FOXStateMachineGenerator.m in Sources */, 1F38B6321A2ACCA80078FF90 /* FOXSuchThatGenerator.m in Sources */, + 1F6DE1861A4F66F900C93B28 /* syn.c in Sources */, 1F38B6B21A2ACCC00078FF90 /* FOXPropertyGenerators.m in Sources */, 1F38B62C1A2ACCA80078FF90 /* FOXSizedGenerator.m in Sources */, + 1F17D5491A3BF17D00E1BB60 /* FOXInstrumentation.m in Sources */, + 1FF0A72A1A5F43C200FA1B49 /* FOXExecutedProgram.m in Sources */, 1F38B6C71A2ACCC00078FF90 /* FOXDebugReporter.m in Sources */, + 1F6DE18E1A4F66F900C93B28 /* udis86.c in Sources */, 1F38B6C01A2ACCC00078FF90 /* FOXRunner.m in Sources */, 1F38B69D1A2ACCC00078FF90 /* FOXPropertyResult.m in Sources */, + 1F2E363A1A6C546B009799D0 /* FOXCyclicRandom.m in Sources */, 1F38B6221A2ACCA80078FF90 /* FOXChooseGenerator.m in Sources */, 1F38B6B01A2ACCC00078FF90 /* FOXNumericGenerators.m in Sources */, + 1FF0A7241A5F3F7300FA1B49 /* FOXScheduler.m in Sources */, + 1F6DE1821A4F66F900C93B28 /* syn-att.c in Sources */, 1F38B6261A2ACCA80078FF90 /* FOXNamedGenerator.m in Sources */, + 1F6DE1901A4F66F900C93B28 /* mach_override.c in Sources */, 1F38B6AB1A2ACCC00078FF90 /* FOXDictionaryGenerators.m in Sources */, + 1F2E36401A6C5476009799D0 /* FOXSequenceRandom.m in Sources */, 1F38B6CC1A2ACCC00078FF90 /* FOXDSL.m in Sources */, 1F38B69F1A2ACCC00078FF90 /* FOXRoseTree.m in Sources */, + 1F2F02271A3E8C090039D3B3 /* FOXMath.m in Sources */, + 1F7CF6B51A3FF513005C86A5 /* FOXStringUtil.m in Sources */, 1F71D4EB1A3105050017E81A /* FOXEnvironment.m in Sources */, 1F38B61C1A2ACCA80078FF90 /* FOXBlockGenerator.m in Sources */, + 1F6DE17E1A4F66F900C93B28 /* itab.c in Sources */, + 1F7B79711A646BB000BA47A4 /* FOXAssertionException.m in Sources */, 1F38B6281A2ACCA80078FF90 /* FOXPureGenerator.m in Sources */, + 1F6DE1741A4F66F900C93B28 /* decode.c in Sources */, 1F38B6BA1A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */, + 1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */, 1F38B6A51A2ACCC00078FF90 /* FOXTransition.m in Sources */, 1F71D4F11A3105520017E81A /* FOXDebugging.m in Sources */, + 1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */, 1F38B6991A2ACCC00078FF90 /* FOXCommand.m in Sources */, + 1FCE1B271A4570D500902226 /* FOXLogging.m in Sources */, 1F38B6C91A2ACCC00078FF90 /* FOXStandardReporter.m in Sources */, 1F38B6A91A2ACCC00078FF90 /* FOXCoreGenerators.m in Sources */, + 1F9E645C1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */, + 1F2E362F1A6BAA93009799D0 /* FOXArraySequence.m in Sources */, 1F38B6C21A2ACCC00078FF90 /* FOXConstantRandom.m in Sources */, - 1F38B6561A2ACCAE0078FF90 /* FOXArray.m in Sources */, + 1F13AD731A60990C00DD65C6 /* FOXProgram.m in Sources */, + 1F38B6561A2ACCAE0078FF90 /* FOXPrettyArray.m in Sources */, 1F38B6241A2ACCA80078FF90 /* FOXMapGenerator.m in Sources */, 1F38B62E1A2ACCA80078FF90 /* FOXStringGenerator.m in Sources */, 1F38B6B71A2ACCC00078FF90 /* FOXStateMachineGenerators.m in Sources */, @@ -1071,13 +1571,20 @@ 1F38B6BC1A2ACCC00078FF90 /* FOXGenericGenerators.m in Sources */, 1FAE3B681A2EC5E60011838A /* SwiftGenerators.swift in Sources */, 1F38B6201A2ACCA80078FF90 /* FOXBindGenerator.m in Sources */, + 1F7B0AA01A4C9160003BDF21 /* FOXThread.m in Sources */, 1F38B62A1A2ACCA80078FF90 /* FOXSequenceGenerator.m in Sources */, 1F38B6A71A2ACCC00078FF90 /* FOXArrayGenerators.m in Sources */, + 1F6DE1841A4F66F900C93B28 /* syn-intel.c in Sources */, + 1FE168BB1A60AF5A0004734A /* TypedData.swift in Sources */, + 1FF6792A1A5E8EC6004F54DA /* FOXBlock.m in Sources */, 1F38B64E1A2ACCAE0078FF90 /* FOXLazySequence.m in Sources */, 1F38B69B1A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */, + 1F7CF6AF1A3FF146005C86A5 /* FOXDictionary.m in Sources */, 1F38B6A31A2ACCC00078FF90 /* FOXSequence.m in Sources */, + 1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */, 1F38B61E1A2ACCA80078FF90 /* FOXArrayGenerator.m in Sources */, 1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */, + 31B73D3CD71E35249F44DA0F /* FOXRaiseResult.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1086,6 +1593,7 @@ buildActionMask = 2147483647; files = ( 1F38B6E81A2ACCF10078FF90 /* FOXPropertySpec.mm in Sources */, + 1F4A56A31A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm in Sources */, 1F38B6E41A2ACCF10078FF90 /* FOXCharacterSpec.mm in Sources */, 1F38B6D51A2ACCE80078FF90 /* QueueRemoveTransition.m in Sources */, 1F38B6D71A2ACCF10078FF90 /* FOXRandomSpec.mm in Sources */, @@ -1094,6 +1602,7 @@ 1FFCE56F1A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm in Sources */, 1F38B6D91A2ACCF10078FF90 /* FOXRoseTreeSpec.mm in Sources */, 1F38B6E61A2ACCF10078FF90 /* FOXSuchThatSpec.mm in Sources */, + 1FF4AA721A3F97650000E69E /* FOXAlwaysSpec.mm in Sources */, 1F38B6E51A2ACCF10078FF90 /* FOXFiniteStateMachineSpec.mm in Sources */, 1F38B6DE1A2ACCF10078FF90 /* FOXNegativeIntegerSpec.mm in Sources */, 1F38B6E01A2ACCF10078FF90 /* FOXReturnSpec.mm in Sources */, @@ -1108,6 +1617,7 @@ 1FAE3B6E1A2F10080011838A /* FOXFloatSpec.mm in Sources */, 1F71D4F41A313C720017E81A /* FOXFrequencySpec.mm in Sources */, 1F38B6D81A2ACCF10078FF90 /* FOXSequenceSpec.mm in Sources */, + 1FF4AA6F1A3EC8480000E69E /* Ticker.m in Sources */, 1F38B6E11A2ACCF10078FF90 /* FOXSetSpec.mm in Sources */, 1F38B6DB1A2ACCF10078FF90 /* FOXChooseSpec.mm in Sources */, 1F38B6D41A2ACCE80078FF90 /* QueueAddTransition.m in Sources */, @@ -1126,35 +1636,59 @@ buildActionMask = 2147483647; files = ( 1F38B67F1A2ACCC00078FF90 /* FOXSetGenerators.m in Sources */, + 1F7B0AA71A4CC797003BDF21 /* FOXMemory.m in Sources */, + 1F2E36341A6BAA93009799D0 /* FOXRepeatedSequence.m in Sources */, 1F38B68F1A2ACCC00078FF90 /* FOXDeterministicRandom.mm in Sources */, 1F38B6581A2ACCAE0078FF90 /* FOXConcreteSequence.m in Sources */, 1F38B6781A2ACCC00078FF90 /* FOXFiniteStateMachine.m in Sources */, 1F38B65C1A2ACCAE0078FF90 /* FOXSequenceEnumerator.m in Sources */, 1F38B66C1A2ACCC00078FF90 /* FOXRunnerResult.m in Sources */, + 1F6DE17B1A4F66F900C93B28 /* input.c in Sources */, 1F38B6481A2ACCA90078FF90 /* FOXTupleGenerator.m in Sources */, + 1F4A56AA1A3B4CE9009E1637 /* FOXStateMachineGenerator.m in Sources */, 1F38B64A1A2ACCA90078FF90 /* FOXSuchThatGenerator.m in Sources */, + 1F6DE1871A4F66F900C93B28 /* syn.c in Sources */, 1F38B67D1A2ACCC00078FF90 /* FOXPropertyGenerators.m in Sources */, 1F38B6441A2ACCA90078FF90 /* FOXSizedGenerator.m in Sources */, + 1F17D54A1A3BF17D00E1BB60 /* FOXInstrumentation.m in Sources */, + 1FF0A72B1A5F43C200FA1B49 /* FOXExecutedProgram.m in Sources */, 1F38B6921A2ACCC00078FF90 /* FOXDebugReporter.m in Sources */, + 1F6DE18F1A4F66F900C93B28 /* udis86.c in Sources */, 1F38B68B1A2ACCC00078FF90 /* FOXRunner.m in Sources */, 1F38B6681A2ACCC00078FF90 /* FOXPropertyResult.m in Sources */, + 1F2E363B1A6C546B009799D0 /* FOXCyclicRandom.m in Sources */, 1F38B63A1A2ACCA90078FF90 /* FOXChooseGenerator.m in Sources */, 1F38B67B1A2ACCC00078FF90 /* FOXNumericGenerators.m in Sources */, + 1FF0A7251A5F3F7300FA1B49 /* FOXScheduler.m in Sources */, + 1F6DE1831A4F66F900C93B28 /* syn-att.c in Sources */, 1F38B63E1A2ACCA90078FF90 /* FOXNamedGenerator.m in Sources */, + 1F6DE1911A4F66F900C93B28 /* mach_override.c in Sources */, 1F38B6761A2ACCC00078FF90 /* FOXDictionaryGenerators.m in Sources */, + 1F2E36411A6C5476009799D0 /* FOXSequenceRandom.m in Sources */, 1F38B6971A2ACCC00078FF90 /* FOXDSL.m in Sources */, 1F38B66A1A2ACCC00078FF90 /* FOXRoseTree.m in Sources */, + 1F2F02281A3E8C090039D3B3 /* FOXMath.m in Sources */, + 1F7CF6B61A3FF513005C86A5 /* FOXStringUtil.m in Sources */, 1F71D4EC1A3105050017E81A /* FOXEnvironment.m in Sources */, 1F38B6341A2ACCA90078FF90 /* FOXBlockGenerator.m in Sources */, + 1F6DE17F1A4F66F900C93B28 /* itab.c in Sources */, + 1F7B79721A646BB000BA47A4 /* FOXAssertionException.m in Sources */, 1F38B6401A2ACCA90078FF90 /* FOXPureGenerator.m in Sources */, + 1F6DE1751A4F66F900C93B28 /* decode.c in Sources */, 1F38B6851A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */, + 1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */, 1F38B6701A2ACCC00078FF90 /* FOXTransition.m in Sources */, 1F71D4F21A3105520017E81A /* FOXDebugging.m in Sources */, + 1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */, 1F38B6641A2ACCC00078FF90 /* FOXCommand.m in Sources */, + 1FCE1B281A4570D500902226 /* FOXLogging.m in Sources */, 1F38B6941A2ACCC00078FF90 /* FOXStandardReporter.m in Sources */, 1F38B6741A2ACCC00078FF90 /* FOXCoreGenerators.m in Sources */, + 1F9E645D1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */, + 1F2E36301A6BAA93009799D0 /* FOXArraySequence.m in Sources */, 1F38B68D1A2ACCC00078FF90 /* FOXConstantRandom.m in Sources */, - 1F38B6621A2ACCAE0078FF90 /* FOXArray.m in Sources */, + 1F13AD741A60990C00DD65C6 /* FOXProgram.m in Sources */, + 1F38B6621A2ACCAE0078FF90 /* FOXPrettyArray.m in Sources */, 1F38B63C1A2ACCA90078FF90 /* FOXMapGenerator.m in Sources */, 1F38B6461A2ACCA90078FF90 /* FOXStringGenerator.m in Sources */, 1F38B6821A2ACCC00078FF90 /* FOXStateMachineGenerators.m in Sources */, @@ -1162,13 +1696,20 @@ 1F38B6871A2ACCC00078FF90 /* FOXGenericGenerators.m in Sources */, 1FAE3B691A2EC5E60011838A /* SwiftGenerators.swift in Sources */, 1F38B6381A2ACCA90078FF90 /* FOXBindGenerator.m in Sources */, + 1F7B0AA11A4C9160003BDF21 /* FOXThread.m in Sources */, 1F38B6421A2ACCA90078FF90 /* FOXSequenceGenerator.m in Sources */, 1F38B6721A2ACCC00078FF90 /* FOXArrayGenerators.m in Sources */, + 1F6DE1851A4F66F900C93B28 /* syn-intel.c in Sources */, + 1FE168BC1A60AF5A0004734A /* TypedData.swift in Sources */, + 1FF6792B1A5E8EC6004F54DA /* FOXBlock.m in Sources */, 1F38B65A1A2ACCAE0078FF90 /* FOXLazySequence.m in Sources */, 1F38B6661A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */, + 1F7CF6B01A3FF146005C86A5 /* FOXDictionary.m in Sources */, 1F38B66E1A2ACCC00078FF90 /* FOXSequence.m in Sources */, + 1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */, 1F38B6361A2ACCA90078FF90 /* FOXArrayGenerator.m in Sources */, 1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */, + 31B7348EC23DF7619297D32A /* FOXRaiseResult.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1177,6 +1718,7 @@ buildActionMask = 2147483647; files = ( 1F38B6FA1A2ACCF20078FF90 /* FOXPropertySpec.mm in Sources */, + 1F4A56A41A3B3EE6009E1637 /* FOXParallelStateMachineSpec.mm in Sources */, 1F38B6F61A2ACCF20078FF90 /* FOXCharacterSpec.mm in Sources */, 1F38B6D11A2ACCE70078FF90 /* QueueRemoveTransition.m in Sources */, 1F38B6E91A2ACCF20078FF90 /* FOXRandomSpec.mm in Sources */, @@ -1185,6 +1727,7 @@ 1FFCE5701A81E13400A427AA /* FOXStrictNegativeIntegerSpec.mm in Sources */, 1F38B6EB1A2ACCF20078FF90 /* FOXRoseTreeSpec.mm in Sources */, 1F38B6F81A2ACCF20078FF90 /* FOXSuchThatSpec.mm in Sources */, + 1FF4AA731A3F97650000E69E /* FOXAlwaysSpec.mm in Sources */, 1F38B6F71A2ACCF20078FF90 /* FOXFiniteStateMachineSpec.mm in Sources */, 1F38B6F01A2ACCF20078FF90 /* FOXNegativeIntegerSpec.mm in Sources */, 1F38B6F21A2ACCF20078FF90 /* FOXReturnSpec.mm in Sources */, @@ -1199,6 +1742,7 @@ 1FAE3B6F1A2F10080011838A /* FOXFloatSpec.mm in Sources */, 1F71D4F51A313C720017E81A /* FOXFrequencySpec.mm in Sources */, 1F38B6EA1A2ACCF20078FF90 /* FOXSequenceSpec.mm in Sources */, + 1FF4AA701A3EC8480000E69E /* Ticker.m in Sources */, 1F38B6F31A2ACCF20078FF90 /* FOXSetSpec.mm in Sources */, 1F38B6ED1A2ACCF20078FF90 /* FOXChooseSpec.mm in Sources */, 1F38B6D01A2ACCE70078FF90 /* QueueAddTransition.m in Sources */, @@ -1212,6 +1756,48 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1FF4AAAC1A3FD7C10000E69E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F7CF6641A3FD7FF005C86A5 /* NSArray+FastEnumerator.m in Sources */, + 1F7CF6661A3FD7FF005C86A5 /* Queue.m in Sources */, + 1F7CF6681A3FD7FF005C86A5 /* QueueAddTransition.m in Sources */, + 1F7CF66A1A3FD7FF005C86A5 /* QueueRemoveTransition.m in Sources */, + 1F7CF66C1A3FD7FF005C86A5 /* FOXSpecHelper.m in Sources */, + 1F7CF66E1A3FD7FF005C86A5 /* Ticker.m in Sources */, + 1F7CF66F1A3FD7FF005C86A5 /* FOXRandomSpec.mm in Sources */, + 1F7CF6701A3FD7FF005C86A5 /* FOXSequenceSpec.mm in Sources */, + 1F7CF6711A3FD7FF005C86A5 /* FOXRoseTreeSpec.mm in Sources */, + 1F7CF6721A3FD7FF005C86A5 /* FOXAnyObjectSpec.mm in Sources */, + 1F7CF6731A3FD7FF005C86A5 /* FOXArraySpec.mm in Sources */, + 1F7CF6741A3FD7FF005C86A5 /* FOXBindSpec.mm in Sources */, + 1F7CF6751A3FD7FF005C86A5 /* FOXCharacterSpec.mm in Sources */, + 1F7CF6761A3FD7FF005C86A5 /* FOXChooseSpec.mm in Sources */, + 1F7CF6771A3FD7FF005C86A5 /* FOXDecimalNumberSpec.mm in Sources */, + 1F7CF6781A3FD7FF005C86A5 /* FOXDictionarySpec.mm in Sources */, + 1F7CF6791A3FD7FF005C86A5 /* FOXDoubleSpec.mm in Sources */, + 1F7CF67A1A3FD7FF005C86A5 /* FOXFiniteStateMachineSpec.mm in Sources */, + 1F7CF67B1A3FD7FF005C86A5 /* FOXFloatSpec.mm in Sources */, + 1F7CF67C1A3FD7FF005C86A5 /* FOXFrequencySpec.mm in Sources */, + 1F7CF67D1A3FD7FF005C86A5 /* FOXGenericSpec.mm in Sources */, + 1F7CF67E1A3FD7FF005C86A5 /* FOXIntegerSpec.mm in Sources */, + 1F7CF67F1A3FD7FF005C86A5 /* FOXNegativeIntegerSpec.mm in Sources */, + 1F7CF6801A3FD7FF005C86A5 /* FOXOptionalSpec.mm in Sources */, + 1F7CF6811A3FD7FF005C86A5 /* FOXPositiveIntegerSpec.mm in Sources */, + 1F7CF6821A3FD7FF005C86A5 /* FOXResizeSpec.mm in Sources */, + 1F7CF6831A3FD7FF005C86A5 /* FOXReturnSpec.mm in Sources */, + 1F7CF6841A3FD7FF005C86A5 /* FOXSetSpec.mm in Sources */, + 1F7CF6851A3FD7FF005C86A5 /* FOXStringSpec.mm in Sources */, + 1F7CF6861A3FD7FF005C86A5 /* FOXSuchThatSpec.mm in Sources */, + 1F7CF6871A3FD7FF005C86A5 /* FOXTupleGeneratorSpec.mm in Sources */, + 1F7CF6881A3FD7FF005C86A5 /* FOXParallelStateMachineSpec.mm in Sources */, + 1F7CF6891A3FD7FF005C86A5 /* FOXAlwaysSpec.mm in Sources */, + 1F7CF68A1A3FD7FF005C86A5 /* FOXPropertySpec.mm in Sources */, + 1FF4AAB31A3FD7C10000E69E /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1225,6 +1811,11 @@ target = 1F41BEAD1A2ACBA300F25A65 /* Fox-iOS */; targetProxy = 1F41BEBA1A2ACBA300F25A65 /* PBXContainerItemProxy */; }; + 1F7CF6611A3FD7EC005C86A5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1F41BE8F1A2ACB9C00F25A65 /* Fox-OSX */; + targetProxy = 1F7CF6601A3FD7EC005C86A5 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -1245,9 +1836,15 @@ "DEBUG=1", "$(inherited)", ); + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); INFOPLIST_FILE = Fox/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = Fox; @@ -1274,9 +1871,15 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); INFOPLIST_FILE = Fox/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = Fox; @@ -1358,10 +1961,16 @@ "DEBUG=1", "$(inherited)", ); + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); INFOPLIST_FILE = Fox/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = Fox; SKIP_INSTALL = YES; @@ -1385,10 +1994,16 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); INFOPLIST_FILE = Fox/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = Fox; SKIP_INSTALL = YES; @@ -1482,6 +2097,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", + "_XOPEN_SOURCE=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_WARNINGS_AS_ERRORS = YES; @@ -1519,6 +2135,7 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "_XOPEN_SOURCE=1"; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; @@ -1534,6 +2151,62 @@ }; name = Release; }; + 1FF4AAB51A3FD7C10000E69E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Fox-dmobuslqyltucubgnxyazjnfmyjr/Build/Products/Debug", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "FOXSPECS_INSTRUMENTED=1", + ); + GCC_VERSION = net.jeffhui.foxling.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/Externals/cedar/Source/Headers/**", + ); + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + 1FF4AAB61A3FD7C10000E69E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Fox-dmobuslqyltucubgnxyazjnfmyjr/Build/Products/Debug", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "_XOPEN_SOURCE=1", + "FOXSPECS_INSTRUMENTED=1", + ); + GCC_VERSION = net.jeffhui.foxling.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/Externals/cedar/Source/Headers/**", + ); + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1582,6 +2255,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 1FF4AAB41A3FD7C10000E69E /* Build configuration list for PBXNativeTarget "Fox-OSX-Specs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1FF4AAB51A3FD7C10000E69E /* Debug */, + 1FF4AAB61A3FD7C10000E69E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 1F6016041919DCE0003D8484 /* Project object */; diff --git a/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX-Specs.xcscheme b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX-Specs.xcscheme new file mode 100644 index 0000000..ede12b2 --- /dev/null +++ b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX-Specs.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX.xcscheme b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX.xcscheme index 6ece87c..fe51ff9 100644 --- a/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX.xcscheme +++ b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-OSX.xcscheme @@ -81,6 +81,13 @@ ReferencedContainer = "container:Fox.xcodeproj"> + + + + diff --git a/Fox.xcodeproj/xcshareddata/xcschemes/Fox-iOS.xcscheme b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-iOS.xcscheme index 19a7018..9311fde 100644 --- a/Fox.xcodeproj/xcshareddata/xcschemes/Fox-iOS.xcscheme +++ b/Fox.xcodeproj/xcshareddata/xcschemes/Fox-iOS.xcscheme @@ -68,7 +68,7 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" - buildConfiguration = "Debug" + buildConfiguration = "Release" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> diff --git a/Fox.xcworkspace/contents.xcworkspacedata b/Fox.xcworkspace/contents.xcworkspacedata index c627563..2d38176 100644 --- a/Fox.xcworkspace/contents.xcworkspacedata +++ b/Fox.xcworkspace/contents.xcworkspacedata @@ -4,6 +4,9 @@ + + diff --git a/Fox/Private/Data/FOXArray.h b/Fox/Private/Data/FOXArray.h deleted file mode 100644 index 14761c3..0000000 --- a/Fox/Private/Data/FOXArray.h +++ /dev/null @@ -1,9 +0,0 @@ -#import - -// An array that simply provides better description output -@interface FOXArray : NSArray - -+ (instancetype)arrayWithArray:(NSArray *)array; -- (instancetype)initWithArray:(NSArray *)array; - -@end diff --git a/Fox/Private/Data/FOXArray.m b/Fox/Private/Data/FOXArray.m deleted file mode 100644 index dbf5781..0000000 --- a/Fox/Private/Data/FOXArray.m +++ /dev/null @@ -1,51 +0,0 @@ -#import "FOXArray.h" - -@interface FOXArray () -@property (nonatomic) NSArray *backingArray; -@end - -@implementation FOXArray - -+ (instancetype)arrayWithArray:(NSArray *)array { - return [[self alloc] initWithArray:array]; -} - -- (instancetype)initWithArray:(NSArray *)array { - if (self = [super init]) { - self.backingArray = array; - } - return self; -} - -#pragma mark - NSObject - -- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { - NSMutableString *indent = [NSMutableString stringWithFormat:@" "]; - for (NSUInteger i = 0; i < level; i++) { - [indent appendString:@" "]; - } - - NSMutableString *result = [NSMutableString stringWithString:@"@[\n"]; - for (id item in self) { - [result appendFormat:@"%@%@,\n", indent, item]; - } - [result appendString:@"]"]; - return result; - -} - -- (NSString *)debugDescription { - return [self description]; -} - -#pragma mark - NSArray - -- (id)objectAtIndex:(NSUInteger)index { - return [self.backingArray objectAtIndex:index]; -} - -- (NSUInteger)count { - return self.backingArray.count; -} - -@end diff --git a/Fox/Private/Data/FOXArraySequence.h b/Fox/Private/Data/FOXArraySequence.h new file mode 100644 index 0000000..4041a2b --- /dev/null +++ b/Fox/Private/Data/FOXArraySequence.h @@ -0,0 +1,9 @@ +#import "FOXSequence.h" + +/// Exists mostly to reduce memory footprint. +@interface FOXArraySequence : FOXSequence + +- (instancetype)initWithArray:(NSArray *)array; +- (instancetype)initWithArray:(NSArray *)array offset:(NSUInteger)offset; + +@end diff --git a/Fox/Private/Data/FOXArraySequence.m b/Fox/Private/Data/FOXArraySequence.m new file mode 100644 index 0000000..659668b --- /dev/null +++ b/Fox/Private/Data/FOXArraySequence.m @@ -0,0 +1,41 @@ +#import "FOXArraySequence.h" + +@interface FOXArraySequence () +@property (nonatomic) NSArray *array; +@property (nonatomic) NSUInteger offset; +@property (nonatomic) id remainingSequence; +@end + +@implementation FOXArraySequence + +#pragma mark - Public + +- (instancetype)initWithArray:(NSArray *)array +{ + return [self initWithArray:array offset:0]; +} + +- (instancetype)initWithArray:(NSArray *)array offset:(NSUInteger)offset +{ + self = [super init]; + if (self) { + self.offset = offset; + if (offset < array.count) { + self.array = array; + _count = self.array.count - offset; + } + if (self.offset + 1 < self.array.count) { + self.remainingSequence = [[FOXArraySequence alloc] initWithArray:self.array + offset:self.offset + 1]; + } + + } + return self; +} + +- (id)firstObject +{ + return [self.array objectAtIndex:self.offset]; +} + +@end diff --git a/Fox/Private/Data/FOXAssertionException.h b/Fox/Private/Data/FOXAssertionException.h new file mode 100644 index 0000000..4450d81 --- /dev/null +++ b/Fox/Private/Data/FOXAssertionException.h @@ -0,0 +1,11 @@ +#import + +@class FOXPropertyResult; + +@interface FOXAssertionException : NSException + +@property (nonatomic, readonly) FOXPropertyResult *result; + +- (instancetype)initWithPropertyResult:(FOXPropertyResult *)result; + +@end diff --git a/Fox/Private/Data/FOXAssertionException.m b/Fox/Private/Data/FOXAssertionException.m new file mode 100644 index 0000000..d0b8ed7 --- /dev/null +++ b/Fox/Private/Data/FOXAssertionException.m @@ -0,0 +1,20 @@ +#import "FOXAssertionException.h" + +@implementation FOXAssertionException + +- (instancetype)initWithPropertyResult:(FOXPropertyResult *)result +{ + self = [super initWithName:@"FOXAssertionException" + reason:@"Assertion Failed" + userInfo:@{@"FOXPropertyResult": result}]; + if (self) { + } + return self; +} + +- (FOXPropertyResult *)result +{ + return self.userInfo[@"FOXPropertyResult"]; +} + +@end diff --git a/Fox/Private/Data/FOXBlock.h b/Fox/Private/Data/FOXBlock.h new file mode 100644 index 0000000..3ef2b38 --- /dev/null +++ b/Fox/Private/Data/FOXBlock.h @@ -0,0 +1,8 @@ +#import + +@interface FOXBlock : NSObject + +- (instancetype)initWithGroup:(dispatch_group_t)group block:(id(^)())block; +- (void)run; + +@end diff --git a/Fox/Private/Data/FOXBlock.m b/Fox/Private/Data/FOXBlock.m new file mode 100644 index 0000000..affd8d9 --- /dev/null +++ b/Fox/Private/Data/FOXBlock.m @@ -0,0 +1,32 @@ +#import "FOXBlock.h" +#import "FOXThread.h" + +@interface FOXBlock () +@property (nonatomic) dispatch_group_t group; +@property (atomic, copy) id(^block)(); +@property (atomic) id result; +@end + + +@implementation FOXBlock + +- (instancetype)initWithGroup:(dispatch_group_t)group block:(id(^)())block +{ + self = [super init]; + if (self) { + self.group = group; + self.block = block; + } + return self; +} + +- (void)run +{ + @autoreleasepool { + fthread_yield(); + self.result = self.block(); + dispatch_group_leave(self.group); + } +} + +@end diff --git a/Fox/Private/Data/FOXConcreteSequence.m b/Fox/Private/Data/FOXConcreteSequence.m index 18af6aa..3bdbc37 100644 --- a/Fox/Private/Data/FOXConcreteSequence.m +++ b/Fox/Private/Data/FOXConcreteSequence.m @@ -11,6 +11,8 @@ @interface FOXConcreteSequence () @implementation FOXConcreteSequence +#pragma mark - Public + - (instancetype)init { if (self = [super init]) { diff --git a/Fox/Private/Data/FOXDictionary.h b/Fox/Private/Data/FOXDictionary.h new file mode 100644 index 0000000..314c9a5 --- /dev/null +++ b/Fox/Private/Data/FOXDictionary.h @@ -0,0 +1,6 @@ +#import + +// A dictionary that simply provides better description output +@interface FOXDictionary : NSDictionary + +@end diff --git a/Fox/Private/Data/FOXDictionary.m b/Fox/Private/Data/FOXDictionary.m new file mode 100644 index 0000000..7c8b95e --- /dev/null +++ b/Fox/Private/Data/FOXDictionary.m @@ -0,0 +1,61 @@ +#import "FOXDictionary.h" +#import "FOXStringUtil.h" + +@interface FOXDictionary () +@property (nonatomic) NSDictionary *backingDictionary; +@end + +@implementation FOXDictionary + +- (instancetype)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(NSUInteger)cnt +{ + self = [super init]; + if (self) { + self.backingDictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys count:cnt]; + } + return self; +} + +#pragma mark - NSObject + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { + NSString *whitespace = FOXWhitespace(level); + NSMutableString *result = [NSMutableString string]; + [result appendString:whitespace]; + [result appendString:@"@{\n"]; + for (id key in self) { + [result appendString:FOXWhitespace(level + 1)]; + [result appendString:FOXDescription(key, level + 1)]; + [result appendString:@": "]; + [result appendString:FOXTrim(FOXDescription(self[key], level + 1))]; + [result appendString:@",\n"]; + } + [result deleteCharactersInRange:NSMakeRange(result.length - 2, 1)]; + [result appendString:whitespace]; + [result appendString:@"}"]; + return result; + +} + +- (NSString *)debugDescription { + return [self description]; +} + +#pragma mark - NSDictionary + +- (NSUInteger)count +{ + return self.backingDictionary.count; +} + +- (id)objectForKey:(id)aKey +{ + return [self.backingDictionary objectForKey:aKey]; +} + +- (NSEnumerator *)keyEnumerator +{ + return [self.backingDictionary keyEnumerator]; +} + +@end diff --git a/Fox/Private/Data/FOXLazySequence.m b/Fox/Private/Data/FOXLazySequence.m index f9f11a8..688cd68 100644 --- a/Fox/Private/Data/FOXLazySequence.m +++ b/Fox/Private/Data/FOXLazySequence.m @@ -1,5 +1,5 @@ #import "FOXLazySequence.h" -#import "FOXConcreteSequence.h" +#import @interface FOXLazySequence () @@ -11,7 +11,11 @@ @interface FOXLazySequence () @end -@implementation FOXLazySequence +@implementation FOXLazySequence { + OSSpinLock _lock; +} + +#pragma mark - Public - (instancetype)init { @@ -73,28 +77,30 @@ - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state #pragma mark - Private - (id)evaluateBlock { - @synchronized (self) { - if (self.block) { - self.blockValue = self.block(); - self.block = nil; - } - return self.blockValue; + OSSpinLockLock(&_lock); + if (self.block) { + self.blockValue = self.block(); + self.block = nil; } + id result = self.blockValue; + OSSpinLockUnlock(&_lock); + return result; } - (id)evaluateSequence { [self evaluateBlock]; - @synchronized (self) { - if (self.blockValue) { - id value = self.blockValue; - self.blockValue = nil; - while ([self.block isKindOfClass:[FOXLazySequence class]]) { - value = [value evaluateBlock]; - } - self.sequenceValue = value; + OSSpinLockLock(&_lock); + if (self.blockValue) { + id value = self.blockValue; + self.blockValue = nil; + while ([self.block isKindOfClass:[FOXLazySequence class]]) { + value = [value evaluateBlock]; } - return self.sequenceValue; + self.sequenceValue = value; } + id value = self.sequenceValue; + OSSpinLockUnlock(&_lock); + return value; } @end diff --git a/Fox/Private/Data/FOXObjectiveCRepresentation.h b/Fox/Private/Data/FOXObjectiveCRepresentation.h new file mode 100644 index 0000000..afae8f0 --- /dev/null +++ b/Fox/Private/Data/FOXObjectiveCRepresentation.h @@ -0,0 +1,12 @@ +#import "FOXMacros.h" + +@protocol FOXObjectiveCRepresentation + +- (NSString *)objectiveCStringRepresentation; + +@end + +/*! Internal Debugging Tool. Useful to make certain Fox data structures + * Dump an objective-c compatible representation. + */ +FOX_EXPORT NSString *FOXRepr(id obj); diff --git a/Fox/Private/Data/FOXObjectiveCRepresentation.m b/Fox/Private/Data/FOXObjectiveCRepresentation.m new file mode 100644 index 0000000..eb950b3 --- /dev/null +++ b/Fox/Private/Data/FOXObjectiveCRepresentation.m @@ -0,0 +1,40 @@ +#import "FOXObjectiveCRepresentation.h" + +FOX_EXPORT NSString *FOXRepr(id obj) { + if (!obj) { + return nil; + } + if ([obj respondsToSelector:@selector(objectiveCStringRepresentation)]) { + return [obj objectiveCStringRepresentation]; + } + if ([obj isKindOfClass:[NSNull class]]) { + return @"[NSNull null]"; + } + if ([obj isKindOfClass:[NSNumber class]]) { + return [NSString stringWithFormat:@"@%@", obj]; + } + if ([obj isKindOfClass:[NSString class]]) { + return [NSString stringWithFormat:@"@\"%@\"", [[obj stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"] + stringByReplacingOccurrencesOfString:@"\"" + withString:@"\\\""]]; + } + if ([obj isKindOfClass:[NSArray class]]) { + NSMutableString *result = [NSMutableString stringWithFormat:@"@["]; + for (id item in obj) { + [result appendFormat:@"%@,\n", FOXRepr(item)]; + } + [result appendString:@"]"]; + return result; + } + if ([obj isKindOfClass:[NSDictionary class]]) { + NSMutableString *result = [NSMutableString stringWithFormat:@"@{"]; + for (id key in obj) { + [result appendFormat:@"%@: %@,\n", FOXRepr(key), FOXRepr(obj[key])]; + } + [result appendString:@"}"]; + return result; + } + [NSException raise:NSInvalidArgumentException format:@"object is not supported to dump: %@ (%@)", + obj, NSStringFromClass([obj class])]; + return nil; +} diff --git a/Fox/Private/Data/FOXPrettyArray.h b/Fox/Private/Data/FOXPrettyArray.h new file mode 100644 index 0000000..04957aa --- /dev/null +++ b/Fox/Private/Data/FOXPrettyArray.h @@ -0,0 +1,6 @@ +#import + +// An array that simply provides better description output +@interface FOXPrettyArray : NSArray + +@end diff --git a/Fox/Private/Data/FOXPrettyArray.m b/Fox/Private/Data/FOXPrettyArray.m new file mode 100644 index 0000000..2140b24 --- /dev/null +++ b/Fox/Private/Data/FOXPrettyArray.m @@ -0,0 +1,54 @@ +#import "FOXPrettyArray.h" +#import "FOXStringUtil.h" + +@interface FOXPrettyArray () +@property (nonatomic) NSArray *backingArray; +@end + +@implementation FOXPrettyArray + +- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt +{ + if (self = [super init]) { + self.backingArray = [[NSArray alloc] initWithObjects:objects count:cnt]; + } + return self; +} + +#pragma mark - NSObject + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { + if (self.count == 0) { + return @"@[]"; + } + NSString *whitespace = FOXWhitespace(level); + NSMutableString *result = [NSMutableString string]; + [result appendString:whitespace]; + [result appendString:@"@[\n"]; + for (id item in self) { + [result appendString:FOXWhitespace(level + 1)]; + [result appendString:FOXTrim(FOXDescription(item, level + 1))]; + [result appendString:@",\n"]; + } + [result deleteCharactersInRange:NSMakeRange(result.length - 2, 1)]; + [result appendString:whitespace]; + [result appendString:@"]"]; + return result; + +} + +- (NSString *)debugDescription { + return [self description]; +} + +#pragma mark - NSArray + +- (id)objectAtIndex:(NSUInteger)index { + return [self.backingArray objectAtIndex:index]; +} + +- (NSUInteger)count { + return self.backingArray.count; +} + +@end diff --git a/Fox/Private/Data/FOXRepeatedSequence.h b/Fox/Private/Data/FOXRepeatedSequence.h new file mode 100644 index 0000000..9625a6c --- /dev/null +++ b/Fox/Private/Data/FOXRepeatedSequence.h @@ -0,0 +1,8 @@ +#import "FOXSequence.h" + +/// Exists mostly to reduce memory footprint. +@interface FOXRepeatedSequence : FOXSequence + +- (instancetype)initWithObject:(id)object times:(NSUInteger)times; + +@end diff --git a/Fox/Private/Data/FOXRepeatedSequence.m b/Fox/Private/Data/FOXRepeatedSequence.m new file mode 100644 index 0000000..b9a88d8 --- /dev/null +++ b/Fox/Private/Data/FOXRepeatedSequence.m @@ -0,0 +1,53 @@ +#import "FOXRepeatedSequence.h" +#import "FOXObjectiveCRepresentation.h" + +@interface FOXRepeatedSequence () +@property (nonatomic) id firstObject; +@property (nonatomic) id remainingSequence; +@end + +@implementation FOXRepeatedSequence + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + id firstObject = [aDecoder decodeObjectForKey:@"firstObject"]; + NSUInteger times = [aDecoder decodeIntegerForKey:@"times"]; + return [self initWithObject:firstObject times:times]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.firstObject forKey:@"firstObject"]; + [aCoder encodeInteger:_count forKey:@"times"]; +} + +#pragma mark - Public + +- (instancetype)initWithObject:(id)object times:(NSUInteger)times +{ + self = [super init]; + if (self) { + if (times > 0) { + self.firstObject = object; + // we must hold only remainingSequence since autoreleased objects + // will cause problems inside objc foreaches + self.remainingSequence = [[FOXRepeatedSequence alloc] initWithObject:object + times:times - 1]; + } + _count = times; + } + return self; +} + +#pragma mark - FOXObjectiveCRepresentation + +- (NSString *)objectiveCStringRepresentation +{ + return [NSString stringWithFormat:@"[FOXSequence sequenceWithObject:%@ times:%lu]", + FOXRepr(self.firstObject), + _count]; +} + +@end diff --git a/Fox/Private/Data/FOXRoseTree+Protected.h b/Fox/Private/Data/FOXRoseTree+Protected.h new file mode 100644 index 0000000..fd8e44f --- /dev/null +++ b/Fox/Private/Data/FOXRoseTree+Protected.h @@ -0,0 +1,14 @@ +#import "FOXRoseTree.h" + +@interface FOXRoseTree (Protected) + +/*! Frees all internal data the rose tree stores. Similar to calling -[dealloc]. + * + * This can be used when traversing the rose tree to eliminate memory spikes + * at the expense of complexity to sure the rose tree isn't used afterwards. + * + * @warning Mutates an "immutable" data structure. + */ +- (void)freeInternals; + +@end diff --git a/Fox/Private/Data/FOXRunnerResult+Protected.h b/Fox/Private/Data/FOXRunnerResult+Protected.h new file mode 100644 index 0000000..7376958 --- /dev/null +++ b/Fox/Private/Data/FOXRunnerResult+Protected.h @@ -0,0 +1,6 @@ +#import "FOXRunnerResult.h" +#import "FOXRoseTree.h" + +@interface FOXRunnerResult (Protected) +@property (nonatomic) FOXRoseTree *failingRoseTree; +@end diff --git a/Fox/Private/Data/FOXRunnerResult+Protected.m b/Fox/Private/Data/FOXRunnerResult+Protected.m new file mode 100644 index 0000000..0fa0000 --- /dev/null +++ b/Fox/Private/Data/FOXRunnerResult+Protected.m @@ -0,0 +1,18 @@ +#import "FOXRunnerResult+Protected.h" +#import + +@implementation FOXRunnerResult (Protected) + +const char *FOXRunnerResultFailingRoseTreeKey; + +- (FOXRoseTree *)failingRoseTree +{ + return objc_getAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey); +} + +- (void)setFailingRoseTree:(FOXRunnerResult *)failingRoseTree +{ + objc_setAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey, failingRoseTree, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/Fox/Private/Data/FOXSequenceEnumerator.h b/Fox/Private/Data/FOXSequenceEnumerator.h index c944839..1e2c21d 100644 --- a/Fox/Private/Data/FOXSequenceEnumerator.h +++ b/Fox/Private/Data/FOXSequenceEnumerator.h @@ -1,5 +1,6 @@ -#import "FOXSequence.h" +#import +@protocol FOXSequence; @interface FOXSequenceEnumerator : NSEnumerator diff --git a/Fox/Private/Data/FOXSequenceEnumerator.m b/Fox/Private/Data/FOXSequenceEnumerator.m index fed0f00..0ea1bc1 100644 --- a/Fox/Private/Data/FOXSequenceEnumerator.m +++ b/Fox/Private/Data/FOXSequenceEnumerator.m @@ -1,5 +1,5 @@ #import "FOXSequenceEnumerator.h" - +#import "FOXSequence.h" @implementation FOXSequenceEnumerator diff --git a/Fox/Private/FOXLogging.h b/Fox/Private/FOXLogging.h new file mode 100644 index 0000000..29373e6 --- /dev/null +++ b/Fox/Private/FOXLogging.h @@ -0,0 +1,10 @@ +#import "FOXMacros.h" + +typedef NS_ENUM(NSUInteger, FOXLogLevel) { + FOXLogLevelNone, + FOXLogLevelError, + FOXLogLevelWarning, + FOXLogLevelDebug, +}; + +FOX_EXPORT void FOXLog(FOXLogLevel level, NSString *format, ...) NS_FORMAT_FUNCTION(2, 3); diff --git a/Fox/Private/FOXLogging.m b/Fox/Private/FOXLogging.m new file mode 100644 index 0000000..ee72bdb --- /dev/null +++ b/Fox/Private/FOXLogging.m @@ -0,0 +1,13 @@ +#import "FOXLogging.h" + +static FOXLogLevel _foxLogLevel = FOXLogLevelNone; + +FOX_EXPORT void FOXLog(FOXLogLevel level, NSString *format, ...) { + if (level >= _foxLogLevel) { + va_list args; + va_start(args, format); + printf("%s\n", [[NSString alloc] initWithFormat:format arguments:args].UTF8String); + fflush(stdout); + va_end(args); + } +} diff --git a/Fox/Private/FOXMath.h b/Fox/Private/FOXMath.h new file mode 100644 index 0000000..3fc322d --- /dev/null +++ b/Fox/Private/FOXMath.h @@ -0,0 +1,17 @@ +#import "FOXMacros.h" + +@protocol FOXRandom; + +/// Combination algorithm that performs no heap memory allocations +/// produces indicies of combinations for a given numericSize. +/// +/// If the block returns NO, stops the permutation loop. +FOX_EXPORT void eachCombination(NSUInteger numericSize, NSUInteger combinationSize, void(^processor)(NSUInteger *combination, NSUInteger size)); + +/// permutation algorithm that performs no heap memory allocations. +/// mutates items array to produce each permutation. +/// +/// If the block returns NO, stops the permutation loop. +FOX_EXPORT void eachPermutation(NSMutableArray *items, BOOL(^processor)(NSArray *permutation)); + +FOX_EXPORT void foreverRandom(NSArray *items, id random, BOOL(^processor)(id item)); diff --git a/Fox/Private/FOXMath.m b/Fox/Private/FOXMath.m new file mode 100644 index 0000000..ba55730 --- /dev/null +++ b/Fox/Private/FOXMath.m @@ -0,0 +1,76 @@ +#import "FOXMath.h" +#import "FOXRandom.h" + + +void _combination(NSUInteger maxNumber, + NSUInteger originalCombinationSize, + NSUInteger combinationSize, + NSUInteger selectedDigits, + NSUInteger power, + void(^processor)(NSUInteger *combination, NSUInteger size)) { + if (maxNumber < combinationSize + power) { + return; + } + + if (combinationSize == 0) { + NSUInteger *combination = NULL; + NSUInteger i = 0; + if (originalCombinationSize > 0) { + combination = (NSUInteger *)alloca(sizeof(NSUInteger) * originalCombinationSize); + for (power = 0; power < maxNumber; power++) { + if (selectedDigits & (1 << power)) { + combination[i++] = power; + } + } + } + processor(combination, i); + return; + } + _combination(maxNumber, combinationSize, combinationSize - 1, selectedDigits | (1 << power), power + 1, processor); + _combination(maxNumber, combinationSize, combinationSize, selectedDigits, power + 1, processor); +} + +void eachCombination(NSUInteger numericSize, NSUInteger combinationSize, void(^processor)(NSUInteger *combination, NSUInteger size)) { + _combination(numericSize, combinationSize, combinationSize, 0, 0, processor); +} + +void _permutations(CFMutableArrayRef items, NSUInteger numItems, NSUInteger originalNumItems, BOOL (^processor)(NSArray *)) { + int count = 0, index; + CFTypeRef temp; + while (1) { + if (numItems > 2) { + _permutations(items, numItems - 1, originalNumItems, processor); + } + if (count >= numItems - 1) { + return; + } + + index = (numItems & 1) ? 0 : count; + count++; + + temp = CFArrayGetValueAtIndex(items, numItems - 1); + CFArraySetValueAtIndex(items, numItems - 1, CFArrayGetValueAtIndex(items, index)); + CFArraySetValueAtIndex(items, index, temp); + if (!processor((__bridge NSArray *)(items))) { + return; + } + } +} + +void eachPermutation(NSMutableArray *items, BOOL(^processor)(NSArray *permutation)) { + if (!processor(items)) { + return; + } + NSUInteger size = [items count]; + _permutations((__bridge CFMutableArrayRef)(items), size, size, processor); +} + +FOX_EXPORT void foreverRandom(NSArray *items, id random, BOOL(^processor)(id item)) { + BOOL continueProcessing = YES; + NSUInteger maxCount = items.count - 1; + while (continueProcessing) { + NSUInteger index = (NSUInteger)[random randomIntegerWithinMinimum:0 andMaximum:maxCount]; + id item = items[index]; + continueProcessing = processor(item); + } +} diff --git a/Fox/Private/FOXMemory.h b/Fox/Private/FOXMemory.h new file mode 100644 index 0000000..eccc3a0 --- /dev/null +++ b/Fox/Private/FOXMemory.h @@ -0,0 +1,7 @@ +#import "FOXMacros.h" +#import + +FOX_EXPORT void *FOXCalloc(size_t size1, size_t size2); +FOX_EXPORT void *FOXMalloc(size_t size); +FOX_EXPORT void *FOXRealloc(void *oldPtr, size_t size); +FOX_EXPORT char *FOXCStringOnHeap(char *fmt, ...); diff --git a/Fox/Private/FOXMemory.m b/Fox/Private/FOXMemory.m new file mode 100644 index 0000000..1102d25 --- /dev/null +++ b/Fox/Private/FOXMemory.m @@ -0,0 +1,37 @@ +#import "FOXMemory.h" + +void *FOXCalloc(size_t size1, size_t size2) { + void *ptr = calloc(size1, size2); + if (ptr == NULL) { + fprintf(stderr, "calloc(%lu, %lu) failed\n", size1, size2); + abort(); + } + return ptr; +} + +void *FOXMalloc(size_t size) { + void *ptr = malloc(size); + if (ptr == NULL) { + fprintf(stderr, "malloc(%lu) failed\n", size); + abort(); + } + return ptr; +} + +void *FOXRealloc(void *oldPtr, size_t size) { + void *ptr = realloc(oldPtr, size); + if (ptr == NULL) { + fprintf(stderr, "realloc(%p, %lu) failed\n", oldPtr, size); + abort(); + } + return ptr; +} + +FOX_EXPORT char *FOXCStringOnHeap(char *fmt, ...) { + char *str_clone = FOXCalloc((strlen(fmt) + 20), sizeof(char)); + va_list args; + va_start(args, fmt); + vsprintf(str_clone, fmt, args); + va_end(args); + return str_clone; +} diff --git a/Fox/Private/FOXStringUtil.h b/Fox/Private/FOXStringUtil.h new file mode 100644 index 0000000..efe548d --- /dev/null +++ b/Fox/Private/FOXStringUtil.h @@ -0,0 +1,8 @@ +#import "FOXMacros.h" + +FOX_EXPORT NSString *FOXIndentStringWithWhitespace(NSString *string, NSString *whitespace); +FOX_EXPORT NSString *FOXWhitespace(NSUInteger indent); +FOX_EXPORT NSString *FOXIndentString(NSString *string, NSUInteger amount); +FOX_EXPORT NSString *FOXPrefix(NSString *prefix, NSString *string); +FOX_EXPORT NSString *FOXTrim(NSString *string); +FOX_EXPORT NSString *FOXDescription(id obj, NSUInteger indent); diff --git a/Fox/Private/FOXStringUtil.m b/Fox/Private/FOXStringUtil.m new file mode 100644 index 0000000..ea8dc5f --- /dev/null +++ b/Fox/Private/FOXStringUtil.m @@ -0,0 +1,36 @@ +#import "FOXStringUtil.h" + + +FOX_EXPORT NSString *FOXIndentStringWithWhitespace(NSString *string, NSString *whitespace) { + NSArray *lines = [string componentsSeparatedByString:@"\n"]; + NSString *mostlyIndented = [lines componentsJoinedByString:[NSString stringWithFormat:@"\n%@", whitespace]]; + return mostlyIndented; +} + +FOX_EXPORT NSString *FOXWhitespace(NSUInteger indent) { + NSMutableString *whitespace = [NSMutableString stringWithCapacity:indent]; + for (NSUInteger i = 0; i < indent; i++) { + [whitespace appendString:@" "]; + } + return whitespace; +} + +FOX_EXPORT NSString *FOXIndentString(NSString *string, NSUInteger amount) { + return FOXIndentStringWithWhitespace(string, FOXWhitespace(amount)); +} + +FOX_EXPORT NSString *FOXPrefix(NSString *prefix, NSString *string) { + return [prefix stringByAppendingString:string]; +} + +FOX_EXPORT NSString *FOXTrim(NSString *string) { + return [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; +} + +FOX_EXPORT NSString *FOXDescription(id obj, NSUInteger indent) { + if ([obj respondsToSelector:@selector(descriptionWithLocale:indent:)]) { + return [obj descriptionWithLocale:[NSLocale currentLocale] indent:indent]; + } else { + return FOXIndentString([obj description], indent); + } +} diff --git a/Fox/Private/Generators/FOXArrayGenerator.m b/Fox/Private/Generators/FOXArrayGenerator.m index 78eaee1..0759de9 100644 --- a/Fox/Private/Generators/FOXArrayGenerator.m +++ b/Fox/Private/Generators/FOXArrayGenerator.m @@ -2,7 +2,6 @@ #import "FOXSequenceGenerator.h" #import "FOXRoseTree.h" #import "FOXCoreGenerators.h" -#import "FOXSequence.h" @interface FOXArrayGenerator () diff --git a/Fox/Private/Generators/FOXBindGenerator.m b/Fox/Private/Generators/FOXBindGenerator.m index 26019b3..027bf49 100644 --- a/Fox/Private/Generators/FOXBindGenerator.m +++ b/Fox/Private/Generators/FOXBindGenerator.m @@ -33,7 +33,6 @@ - (FOXRoseTree *)lazyTreeWithRandom:(id)random maximumSize:(NSUIntege id resultingGenerator = self.factory(innerTree); return [resultingGenerator lazyTreeWithRandom:random maximumSize:maximumSize]; - } @end diff --git a/Fox/Private/Generators/FOXNamedGenerator.m b/Fox/Private/Generators/FOXNamedGenerator.m index fe0e1bf..ed70e4a 100644 --- a/Fox/Private/Generators/FOXNamedGenerator.m +++ b/Fox/Private/Generators/FOXNamedGenerator.m @@ -21,7 +21,12 @@ - (instancetype)initWithName:(NSString *)name forGenerator:(id)gen self = [super init]; if (self) { self.name = name; - self.generator = generator; + + if ([generator isKindOfClass:[FOXNamedGenerator class]]) { + self.generator = [(FOXNamedGenerator *)generator generator]; + } else { + self.generator = generator; + } } return self; } diff --git a/Fox/Private/Generators/FOXRaiseResult.h b/Fox/Private/Generators/FOXRaiseResult.h new file mode 100644 index 0000000..4bb65a0 --- /dev/null +++ b/Fox/Private/Generators/FOXRaiseResult.h @@ -0,0 +1,5 @@ +#import "FOXMacros.h" + +@class FOXPropertyResult; + +FOX_EXPORT void FOXRaiseResult(FOXPropertyResult *result); diff --git a/Fox/Private/Generators/FOXRaiseResult.m b/Fox/Private/Generators/FOXRaiseResult.m new file mode 100644 index 0000000..6a5354e --- /dev/null +++ b/Fox/Private/Generators/FOXRaiseResult.m @@ -0,0 +1,8 @@ +#import "FOXRaiseResult.h" +#import "FOXAssertionException.h" + + +FOX_EXPORT void FOXRaiseResult(FOXPropertyResult *result) { + FOXAssertionException *exception = [[FOXAssertionException alloc] initWithPropertyResult:result]; + [exception raise]; +} diff --git a/Fox/Private/Generators/FOXStateMachineGenerator.h b/Fox/Private/Generators/FOXStateMachineGenerator.h new file mode 100644 index 0000000..ba715aa --- /dev/null +++ b/Fox/Private/Generators/FOXStateMachineGenerator.h @@ -0,0 +1,13 @@ +#import "FOXGenerator.h" + +@protocol FOXStateMachine; + +@interface FOXStateMachineGenerator : NSObject + +- (instancetype)initWithStateMachine:(id)stateMachine; +- (instancetype)initWithStateMachine:(id)stateMachine + initialModelState:(id)modelState + minSize:(NSNumber *)minSize + maxSize:(NSNumber *)maxSize; + +@end diff --git a/Fox/Private/Generators/FOXStateMachineGenerator.m b/Fox/Private/Generators/FOXStateMachineGenerator.m new file mode 100644 index 0000000..7eaf075 --- /dev/null +++ b/Fox/Private/Generators/FOXStateMachineGenerator.m @@ -0,0 +1,108 @@ +#import "FOXStateMachineGenerator.h" +#import "FOXStateMachine.h" +#import "FOXStateTransition.h" +#import "FOXCoreGenerators.h" +#import "FOXArrayGenerators.h" +#import "FOXCommand.h" +#import "FOXRoseTree.h" + +@interface FOXStateMachineGenerator () +@property (nonatomic) id stateMachine; +@property (nonatomic) id initialModelState; +@property (nonatomic) NSNumber *minSize; +@property (nonatomic) NSNumber *maxSize; +@end + + +@implementation FOXStateMachineGenerator + +- (instancetype)init +{ + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithStateMachine:(id)stateMachine +{ + return [self initWithStateMachine:stateMachine + initialModelState:[stateMachine initialModelState] + minSize:nil + maxSize:nil]; +} + +- (instancetype)initWithStateMachine:(id)stateMachine + initialModelState:(id)modelState + minSize:(NSNumber *)minSize + maxSize:(NSNumber *)maxSize +{ + self = [super init]; + if (self) { + self.stateMachine = stateMachine; + self.initialModelState = modelState; + self.minSize = minSize; + self.maxSize = maxSize; + } + return self; +} + +- (FOXRoseTree *)lazyTreeWithRandom:(id)random maximumSize:(NSUInteger)maximumSize +{ + id gen = [self naiveStateMachineGenerator]; + + return [gen lazyTreeWithRandom:random maximumSize:maximumSize]; +} + +#pragma mark - Private + +#pragma mark Naive State Machine Generator + +- (id)naiveStateMachineGenerator +{ + id generator; + if (!self.maxSize && !self.minSize) { + generator = FOXArray([self commandGenerator]); + } else if ([self.minSize isEqual:self.maxSize]) { + NSUInteger size = [self.minSize unsignedIntegerValue]; + generator = FOXArrayOfSize([self commandGenerator], size); + } else { + NSUInteger minSize = [self.minSize unsignedIntegerValue]; + NSUInteger maxSize = [self.maxSize unsignedIntegerValue]; + generator = FOXArrayOfSizeRange([self commandGenerator], minSize, maxSize); + } + generator = FOXSuchThat(generator, ^BOOL(NSArray *commands) { + id modelState = [self.stateMachine modelStateFromCommandSequence:commands + startingModelState:self.initialModelState]; + return modelState != nil; + }); + + return generator; +} + +- (id)commandGenerator +{ + NSMutableArray *frequencies = [NSMutableArray array]; + for (id transition in [self.stateMachine allTransitions]) { + NSUInteger freq = 1; + if ([transition respondsToSelector:@selector(frequency)]) { + freq = [transition frequency]; + } + [frequencies addObject:@[@(freq), FOXReturn(transition)]]; + } + id transitionsGenerator = FOXFrequency(frequencies); + return FOXGenBind(transitionsGenerator, ^id(FOXRoseTree *generatorTree) { + id transition = generatorTree.value; + id argGenerator = nil; + + if ([transition respondsToSelector:@selector(generator)]) { + argGenerator = [transition generator]; + } else { + argGenerator = FOXReturn(@[]); + } + + return FOXMap(FOXTuple(@[FOXReturn(transition), argGenerator]), ^id(NSArray *commandTuple) { + return [[FOXCommand alloc] initWithTransition:commandTuple[0] generatedValue:commandTuple[1]]; + }); + }); +} + +@end diff --git a/Fox/Private/Generators/FOXStringGenerator.m b/Fox/Private/Generators/FOXStringGenerator.m index 15fb283..10cbe39 100644 --- a/Fox/Private/Generators/FOXStringGenerator.m +++ b/Fox/Private/Generators/FOXStringGenerator.m @@ -1,5 +1,6 @@ #import "FOXStringGenerator.h" #import "FOXCoreGenerators.h" +#import "FOXMemory.h" @interface FOXStringGenerator () @@ -44,12 +45,12 @@ - (NSString *)description { if (!_stringGenerator) { _stringGenerator = FOXMap(self.generator, ^id(NSArray *characters) { - unichar *buffer = alloca(sizeof(unichar) * characters.count); + unichar *buffer = FOXMalloc(sizeof(unichar) * characters.count); NSUInteger i = 0; for (NSNumber *character in characters) { buffer[i++] = [character unsignedShortValue]; } - return [NSString stringWithCharacters:buffer length:characters.count]; + return [[NSString alloc] initWithCharactersNoCopy:buffer length:characters.count freeWhenDone:YES]; }); } return _stringGenerator; diff --git a/Fox/Private/Random/FOXCyclicRandom.h b/Fox/Private/Random/FOXCyclicRandom.h new file mode 100644 index 0000000..b8b4325 --- /dev/null +++ b/Fox/Private/Random/FOXCyclicRandom.h @@ -0,0 +1,8 @@ +#import "FOXRandom.h" + + +@interface FOXCyclicRandom : NSObject + +- (instancetype)initWithValues:(NSArray *)values; + +@end diff --git a/Fox/Private/Random/FOXCyclicRandom.m b/Fox/Private/Random/FOXCyclicRandom.m new file mode 100644 index 0000000..3ead975 --- /dev/null +++ b/Fox/Private/Random/FOXCyclicRandom.m @@ -0,0 +1,54 @@ +#import "FOXCyclicRandom.h" + +@interface FOXCyclicRandom () + +@property (nonatomic) NSArray *values; +@property (nonatomic) NSUInteger offset; +@property (nonatomic) long long minValue; +@property (nonatomic) long long maxValue; + +@end + +@implementation FOXCyclicRandom + +@synthesize seed; + +- (instancetype)initWithValues:(NSArray *)values +{ + self = [super init]; + if (self) { + self.values = values; + self.offset = 0; + + NSArray *sortedValues = [values sortedArrayUsingSelector:@selector(compare:)]; + self.minValue = [sortedValues[0] longLongValue]; + self.maxValue = [sortedValues[0] longLongValue]; + } + return self; +} + +- (long long)randomInteger +{ + NSNumber *result = self.values[self.offset++]; + if (self.offset >= self.values.count) { + self.offset = 0; + } + return [result longLongValue]; +} + +- (long long)randomIntegerWithinMinimum:(long long)minimumNumber andMaximum:(long long)maximumNumber +{ + long long value = [self randomInteger]; + long long delta = maximumNumber - minimumNumber; + if (delta) { + return ((value - self.minValue) % delta) + minimumNumber; + } + return 0; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [[[self class] allocWithZone:zone] initWithValues:self.values]; +} + +@end diff --git a/Fox/Private/Random/FOXSequenceRandom.h b/Fox/Private/Random/FOXSequenceRandom.h new file mode 100644 index 0000000..2747758 --- /dev/null +++ b/Fox/Private/Random/FOXSequenceRandom.h @@ -0,0 +1,14 @@ +#import "FOXRandom.h" +#import "FOXSequence.h" + +@interface FOXSequenceRandom : NSObject + +- (instancetype)initWithSequence:(id)sequence; + +@end + +@interface FOXSequence (SequenceRandom) + ++ (instancetype)lazySequenceFromRandom:(id)random; + +@end diff --git a/Fox/Private/Random/FOXSequenceRandom.m b/Fox/Private/Random/FOXSequenceRandom.m new file mode 100644 index 0000000..5fbb5c9 --- /dev/null +++ b/Fox/Private/Random/FOXSequenceRandom.m @@ -0,0 +1,64 @@ +#import "FOXSequenceRandom.h" + +@interface FOXSequenceRandom () +@property (atomic) id sequence; +@end + +@implementation FOXSequenceRandom + +@synthesize seed; // seed is a no-op + +- (instancetype)initWithSequence:(id)sequence +{ + self = [super init]; + if (self) { + self.sequence = sequence; + } + return self; +} + +- (long long)randomInteger +{ + @synchronized (self) { + @autoreleasepool { + NSNumber *result = [self.sequence firstObject]; + self.sequence = [self.sequence remainingSequence]; + return [result longLongValue]; + } + } +} + +- (long long)randomIntegerWithinMinimum:(long long)minimumNumber andMaximum:(long long)maximumNumber +{ + long long number = [self randomInteger]; + long long delta = (maximumNumber + 1) - minimumNumber; + long long value = 0; + if (delta) { + value = (number % delta); + while (value < minimumNumber) { + value += delta; + } + } + return value; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [[[self class] allocWithZone:zone] initWithSequence:self.sequence]; +} + +@end + +@implementation FOXSequence (SequenceRandom) + ++ (instancetype)lazySequenceFromRandom:(id)random +{ + return [FOXSequence lazySequenceFromBlock:^id{ + @autoreleasepool { + return [FOXSequence sequenceWithObject:@([random randomInteger]) + remainingSequence:[self lazySequenceFromRandom:random]]; + } + }]; +} + +@end diff --git a/Fox/Private/Scheduler/FOXInstrumentation.h b/Fox/Private/Scheduler/FOXInstrumentation.h new file mode 100644 index 0000000..9ca8341 --- /dev/null +++ b/Fox/Private/Scheduler/FOXInstrumentation.h @@ -0,0 +1,5 @@ +#import "FOXMacros.h" + +// currently broken. Maybe useful in the future. +FOX_EXPORT BOOL FOXIsInstrumented(void); +FOX_EXPORT void FOXSetInstrumentation(BOOL enable); diff --git a/Fox/Private/Scheduler/FOXInstrumentation.m b/Fox/Private/Scheduler/FOXInstrumentation.m new file mode 100644 index 0000000..6320619 --- /dev/null +++ b/Fox/Private/Scheduler/FOXInstrumentation.m @@ -0,0 +1,21 @@ +#import "FOXInstrumentation.h" +#import + +static struct { + OSSpinLock lock; + BOOL isInstrumented; +} __foxInstrumentation; + +FOX_EXPORT BOOL FOXIsInstrumented(void) { + OSSpinLockLock(&__foxInstrumentation.lock); + BOOL isInstrumented = __foxInstrumentation.isInstrumented; + OSSpinLockUnlock(&__foxInstrumentation.lock); + + return isInstrumented; +} + +FOX_EXPORT void FOXSetInstrumentation(BOOL enable) { + OSSpinLockLock(&__foxInstrumentation.lock); + __foxInstrumentation.isInstrumented = enable; + OSSpinLockUnlock(&__foxInstrumentation.lock); +} diff --git a/Fox/Private/Scheduler/FOXThread.h b/Fox/Private/Scheduler/FOXThread.h new file mode 100644 index 0000000..08145c4 --- /dev/null +++ b/Fox/Private/Scheduler/FOXThread.h @@ -0,0 +1,157 @@ +/// Cooperative scheduling in a pthreads-like API + +#import "FOXMacros.h" +#import +#import +#import +#import + +// code style: snake case for this file to be more POSIX-styled + +#pragma mark - Fox Extensions + +/*! An opaque type representing Fox's pthread representation. + * + * This can be used with other fox-specific functions instead of using + * pthread_t. It is NOT safe to cast pthread_t to this type. + */ +typedef void *fthread_t; + +/*! An opaque type representing the scheduling algorithm to use. + * Some algorithms may require additional data passed to fthread_run_and_wait. + */ +typedef void *fthread_schedule_algorithm_t; + +/*! A fair scheduling algorithm where each thread, in order of creation, gets + * the same number of unyields to each thread for execute. + * + * Requires no additional algorithm data. + */ +fthread_schedule_algorithm_t fthread_round_robin; + +/*! An unfair scheduling algorithm where each thread randomly gets unyields to + * execute. + * + * Requires a FOXRandom instance as additional algorithm data. + */ +fthread_schedule_algorithm_t fthread_random; + + +fthread_schedule_algorithm_t fthread_random_unblocked; + +/*! Yields the current thread so another thread can execute. + */ +FOX_EXPORT void fthread_yield(void); + +/*! Initializes the global scheduler. You must call this before creating + * any threads to ensure they can be properly scheduled for execution. + * + * Also, this can be used to reset the scheduler to setup an new execution. + */ +FOX_EXPORT void fthread_init(void); + +/*! Runs the threads awaiting execution until they finish. + */ +FOX_EXPORT void fthread_run_and_wait(fthread_schedule_algorithm_t algo, + void *algo_data); + +void fthread_run(fthread_schedule_algorithm_t algo, void *algo_data); +void fthread_wait(void); + +/*! Replaces the normal functions with ones fox provides. See below to see the + * overridden functions. Implementation is currently in flux and can change at + * anytime. + * + * Implementation of this function is subject to change, + * and is currently NOT safe to call for actual iOS devices. + * + * Once called, overriden functions PERMANENTLY MODIFIED. The bool argument + * indicates if the fox code is used or the original function implementation + * is emulated (by calling through to the original implementation). While + * technically identical when the bool is false, this can behave slightly + * differently for concurrent applications due to not having the exact idential + * assembly instructions in comparison to never calling this function. + * + * For more details on how this works, see mach_override. + * + * @warning this function is not thread safe. You should only call this + * prior to using threads. + */ +FOX_EXPORT void fthread_override(bool replace); + +/*! Returns the current fthread for the running thread. Returns NULL if + * fox is not tracking the current thread. + * + * @returns the current fthread_t for this thread. Or NULL if there isn't one. + */ +FOX_EXPORT fthread_t fthread_current(void); + +/*! Returns the current fthread fox is using to track the given pthread. + * Returns NULL if fox is not tracking the current thread. + * + * @param pthread The pthread_t representation of the fthread_t to get. + * @returns The fthread_t associated to the given pthread_t. Or NULL if there + * isn't one. + */ +FOX_EXPORT fthread_t fthread_get(pthread_t pthread); + +/*! Unyields the given thread so it can execute. + */ +FOX_EXPORT void fthread_unyield(fthread_t fthread); + +/*! Makes the current thread block until the given thread yields. This is + * rarely used since fthread_run_and_wait() does this internally. + * + * @param fthread The thread to wait until it yields via fthread_yield(). + */ +FOX_EXPORT void fthread_waitfor(fthread_t fthread); + +// The following functions can change at anytime to comply to the the functions +// they replace. This is to ensure they are ABI compatible with the system +// provided implementations. + +#pragma mark - POSIX Threads + +FOX_EXPORT int fthread_create(pthread_t *thread, + pthread_attr_t *attr, + void *(*thread_main)(void *), + void *thread_data); +FOX_EXPORT int fthread_detach(pthread_t thread); +FOX_EXPORT void fthread_exit(void *); +FOX_EXPORT int fthread_join(pthread_t, void **); + +#pragma mark Mutex + +FOX_EXPORT int fthread_mutex_lock(pthread_mutex_t *mutex); + +#pragma mark Conditional Variables + +FOX_EXPORT int fthread_cond_timedwait(pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *timespec); +FOX_EXPORT int fthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); + +#pragma mark - POSIX Semaphores + +FOX_EXPORT int fox_sem_wait(sem_t *sem); + +#pragma mark - Mach Semaphores + +FOX_EXPORT kern_return_t fox_semaphore_wait(semaphore_t semaphore); +FOX_EXPORT kern_return_t fox_semaphore_timedwait(semaphore_t semaphore, + mach_timespec_t wait_time); + +// not supported...yet +//kern_return_t fox_semaphore_timedwait_signal(semaphore_t wait_semaphore, +// semaphore_t signal_semaphore, +// mach_timespec_t wait_time); +// +//kern_return_t fox_semaphore_wait_signal(semaphore_t wait_semaphore, +// semaphore_t signal_semaphore); +// +//kern_return_t fox_semaphore_signal_thread(semaphore_t semaphore, +// thread_t thread); + +#pragma mark - OSSpinLocks + +FOX_EXPORT void fox_spinlock_lock(volatile OSSpinLock *lock); diff --git a/Fox/Private/Scheduler/FOXThread.m b/Fox/Private/Scheduler/FOXThread.m new file mode 100644 index 0000000..b69e518 --- /dev/null +++ b/Fox/Private/Scheduler/FOXThread.m @@ -0,0 +1,902 @@ +#import "FOXThread.h" +#import "mach_override.h" +#import "FOXMemory.h" +#import "FOXThreadMachine.h" +#import "FOXRandom.h" + +// Code Style: +// For this file please conform to some coding styles to help avoid some +// potential concurrency issues: +// +// - Only one return statement per function. +// - Either return or abort on errors. Never implicitly ignore errors. +// - Shared resources must by locked +// - Avoid printing. Printing uses locks that can cause infinite recursion. +// - Try to avoid allocating memory. +// +// Implementation Note: +// At the time of writing of this note, low-level implementations are as +// follows: +// +// - libdispatch uses either mach features and/or pthread features +// - pthreads uses mach features +// +// This makes libdispatch unsafe to use in this library. pthread APIs can be +// used if they are not being overridden, but they should all be abstracted to +// the fthread_machine interface + +// When defined, this macro will enable debug logging of the scheduler. +// Note: Enabling this will DISABLE fox's hook into pthread mutex locks. +// uncomment this when debugging, but leave this commented when committing. +//#define FOX_LOG_THREADS + +#ifdef FOX_LOG_THREADS +# define FTHREAD_DEBUG(...) printf(__VA_ARGS__) +#else +# define FTHREAD_DEBUG(...) +#endif + +// a short-hand to type-casting to the function type pthreads expects +#define THREAD_FN(fn) ((void *(*)(void *))(fn)) + +// locks fthread / scheduler locks +#define MUTEX_LOCK(M) get_machine()->spinlock_lock((M)) +// unlocks a fthread / scheduler locks +#define MUTEX_UNLOCK(M) get_machine()->spinlock_unlock((M)) + +/// Represents a posix thread +typedef struct __fthread { + // thread-safe, read-only fields + pthread_t pthread; + char *name; + semaphore_t signal_to_unyield; + semaphore_t signal_to_yield; + + // rw-lock fields + OSSpinLock state_lock; + bool is_blocked; + bool is_finished; + bool is_not_first_call; + + // read-only fields + void *(*user_main)(void *); + void *user_data; +} *fthread_internal_t; + +/// Represents the scheduler's data for managing thread execution +/// The actual thread scheduling is done on the worker_thread for ease of +/// implementation. +typedef struct _fthread_scheduler_t { + // rw-lock fields + OSSpinLock lock; + fthread_internal_t worker_thread; + fthread_internal_t *threads; + unsigned int num_threads; + unsigned int capacity; + unsigned int next_thread_number; + void (*algorithm)(struct _fthread_scheduler_t *); + void *algorithm_data; +} fthread_scheduler_t; + +// A boolean to indicate if we have mach_overridden lib functions +// not thread-safe. +static volatile bool __has_overridden_functions; +// A boolean to indicate if we need to "disable" the custom implementations +// not thread-safe. +static volatile bool __use_fox_implementation; + +// pthread key to indicate the current fthread_internal_t +static pthread_key_t current_fthread_key; +static pthread_once_t current_fthread_once; + +// global scheduler. This is global to easily allow threads to yield control +// and derive their names from the scheduler's known thread count. +static fthread_scheduler_t __scheduler = { + .lock = 0, + .threads = NULL, + .worker_thread = NULL, + .num_threads = 0, + .capacity = 0, + .next_thread_number = 0, +}; + +#pragma mark - Private Function Prototypes + +static int fthread_scheduler_create(fthread_internal_t *fthread_ptr, + void *(*thread_main)(void *), + void *thread_data); +static bool fthread_is_blocked(fthread_internal_t fthread); +static bool fthread_set_block_state(fthread_internal_t fthread, bool state); +static void fthread_blocking_yield(); +static bool fthread_is_complete(fthread_internal_t fthread); +static void fthread_yield_thread(fthread_internal_t fthread); +static void fthread_free(fthread_internal_t fthread); + +#pragma mark - Helper Functions + +static void must(int result, char *error_msg) { + if (result) { + fprintf(stderr, "%s\n", error_msg); + exit(2); + } +} + +static kern_return_t retry_if_aborted(semaphore_t s, kern_return_t(*action)(semaphore_t)) { + kern_return_t result = 0; + do { + result = action(s); + } while (result == KERN_ABORTED); + return result; +} + +static kern_return_t semaphore_signal_without_aborting(semaphore_t s) { + return retry_if_aborted(s, get_machine()->semaphore_signal); +} + +static kern_return_t semaphore_wait_without_aborting(semaphore_t s) { + return retry_if_aborted(s, get_machine()->semaphore_wait); +} + +static void _semaphore_create(semaphore_t *s) { + kern_return_t err = get_machine()->semaphore_create(mach_task_self(), s, SYNC_POLICY_FIFO, 0); + if (err) { + fprintf(stderr, "Failed to create semaphore: %d\n", err); + abort(); + } +} + +#pragma mark - Global State Management + +static void create_fthread_key(void) { + get_machine()->thread_key_create(¤t_fthread_key, NULL); +} + +/*! Returns the current fthread_internal_t for the given thread. Can be + * NULL if fox is not currently tracking the given thread. + * + * Note: The main thread WILL return a value (for debugging purposes), but + * only its name field is valid. + */ +static fthread_internal_t get_current_thread(void) { + if (current_fthread_key == 0) { + return NULL; + } + return pthread_getspecific(current_fthread_key); +} + +static void set_current_thread(fthread_internal_t current_thread) { + pthread_setspecific(current_fthread_key, current_thread); +} + +/*! Atomically increments and returns an integer from the global scheduler. + * Useful for naming threads. + */ +unsigned int next_thread_number(void) { + MUTEX_LOCK(&__scheduler.lock); + unsigned int num = ++__scheduler.next_thread_number; + MUTEX_UNLOCK(&__scheduler.lock); + return num; +} + +void fthread_init(void) { + MUTEX_LOCK(&__scheduler.lock); + if (__scheduler.worker_thread != NULL) { + fthread_free(__scheduler.worker_thread); + __scheduler.worker_thread = NULL; + } + for (size_t i = 0; i < __scheduler.num_threads; i++) { + fthread_free(__scheduler.threads[i]); + __scheduler.threads[i] = NULL; + } + free(__scheduler.threads); + __scheduler.next_thread_number = 0; + __scheduler.threads = NULL; + __scheduler.num_threads = 0; + __scheduler.capacity = 0; + MUTEX_UNLOCK(&__scheduler.lock); + get_machine()->thread_once(¤t_fthread_once, create_fthread_key); +} + +void fthread_override(bool replace) { + __use_fox_implementation = replace; + if (!__has_overridden_functions) { + fox_machine_t *machine = get_machine(); + must(mach_override_ptr(&pthread_create, &fthread_create, (void **)&machine->thread_create), + "Failed to replace pthread_create"); + must(mach_override_ptr(&pthread_join, &fthread_join, (void **)&machine->thread_join), + "Failed to replace pthread_join"); + must(mach_override_ptr(&pthread_detach, &fthread_detach, (void **)&machine->thread_detach), + "Failed to replace pthread_detach"); + must(mach_override_ptr(&pthread_exit, &fthread_exit, (void **)&machine->thread_exit), + "Failed to replace pthread_exit"); + must(mach_override_ptr(&pthread_mutex_lock, &fthread_mutex_lock, (void **)&machine->mutex_lock), + "Failed to replace pthread_mutex_lock"); + must(mach_override_ptr(&pthread_cond_wait, &fthread_cond_wait, (void **)&machine->cond_wait), + "Failed to replace pthread_cond_wait"); + must(mach_override_ptr(&pthread_cond_timedwait, &fthread_cond_timedwait, (void **)&machine->cond_timedwait), + "Failed to replace pthread_cond_timedwait"); + must(mach_override_ptr(&sem_wait, &fox_sem_wait, (void **)&machine->sem_wait), + "Failed to replace sem_wait"); + must(mach_override_ptr(&semaphore_wait, &fox_semaphore_wait, (void **)&machine->semaphore_wait), + "Failed to replace semaphore_wait"); + must(mach_override_ptr(&semaphore_timedwait, &fox_semaphore_timedwait, (void **)&machine->semaphore_timedwait), + "Failed to replace semaphore_timedwait"); + must(mach_override_ptr(&OSSpinLockLock, &fox_spinlock_lock, (void **)&machine->spinlock_lock), + "Failed to replace semaphore_timedwait"); + __has_overridden_functions = true; + } +} + +#pragma mark - Scheduling Algorithms + +static void fthread_schedule_round_robin(fthread_scheduler_t *scheduler) { + // does not use the is_blocked state on threads + bool has_runnable_threads = true; + while (has_runnable_threads) { + has_runnable_threads = false; + MUTEX_LOCK(&scheduler->lock); + size_t size = scheduler->num_threads; + assert(size > 1); + MUTEX_UNLOCK(&scheduler->lock); + FTHREAD_DEBUG("Scheduler: %lu thread(s)\n", size); + for (size_t i = 0; i < size; i++) { + set_current_thread(scheduler->worker_thread); + MUTEX_LOCK(&scheduler->lock); + fthread_internal_t fthread = scheduler->threads[i]; + MUTEX_UNLOCK(&scheduler->lock); + if (!fthread_is_complete(fthread)) { + fthread_unyield(fthread); + fthread_waitfor(fthread); + has_runnable_threads = true; + } + } + } +} +fthread_schedule_algorithm_t fthread_round_robin = fthread_schedule_round_robin; + +static bool fthread_has_runnable_threads(fthread_scheduler_t *scheduler) { + MUTEX_LOCK(&scheduler->lock); + bool has_runnable_threads = false; + for (size_t i = 0; i < scheduler->num_threads; i++) { + if (!fthread_is_complete(scheduler->threads[i])) { + has_runnable_threads = true; + break; + } + } + MUTEX_UNLOCK(&scheduler->lock); + return has_runnable_threads; +} + +static void fthread_schedule_random(fthread_scheduler_t *scheduler) { + // does not use the is_blocked state on threads + MUTEX_LOCK(&scheduler->lock); + id random = (__bridge id)(scheduler->algorithm_data); + MUTEX_UNLOCK(&scheduler->lock); + if (!random) { + fprintf(stderr, "No FOXRandom instance in algorithm data\n"); + abort(); + } + + while (fthread_has_runnable_threads(scheduler)) { + MUTEX_LOCK(&scheduler->lock); + size_t last_element = scheduler->num_threads - 1; + MUTEX_UNLOCK(&scheduler->lock); + + long long i = 0; + @autoreleasepool { + i = [random randomIntegerWithinMinimum:0 + andMaximum:last_element]; + } + assert(0 <= i && i <= last_element); + + MUTEX_LOCK(&scheduler->lock); + fthread_internal_t fthread = scheduler->threads[i]; + MUTEX_UNLOCK(&scheduler->lock); + if (!fthread_is_complete(fthread)) { + set_current_thread(scheduler->worker_thread); + fthread_unyield(fthread); + fthread_waitfor(fthread); + } + } +} +fthread_schedule_algorithm_t fthread_random = fthread_schedule_random; + +static void fthread_schedule_random_unblocked(fthread_scheduler_t *scheduler) { + MUTEX_LOCK(&scheduler->lock); + id random = (__bridge id)(scheduler->algorithm_data); + MUTEX_UNLOCK(&scheduler->lock); + if (!random) { + fprintf(stderr, "No FOXRandom instance in algorithm data\n"); + abort(); + } + + while (fthread_has_runnable_threads(scheduler)) { + MUTEX_LOCK(&scheduler->lock); + size_t thread_count = 0; + fthread_internal_t *threads = FOXCalloc(sizeof(fthread_internal_t), scheduler->num_threads); + for (size_t i = 0; i < scheduler->num_threads; i++) { + fthread_internal_t fthread = scheduler->threads[i]; + if (!fthread_is_complete(fthread) && !fthread_is_blocked(fthread)) { + threads[thread_count++] = fthread; + } + } + if (thread_count == 0) { + for (size_t i = 0; i < scheduler->num_threads; i++) { + fthread_internal_t fthread = scheduler->threads[i]; + if (!fthread_is_complete(fthread)) { + threads[thread_count++] = fthread; + } + } + } + MUTEX_UNLOCK(&scheduler->lock); + + long long i = 0; + @autoreleasepool { + i = [random randomIntegerWithinMinimum:0 + andMaximum:thread_count - 1]; + } + assert(0 <= i && i <= thread_count - 1); + + MUTEX_LOCK(&scheduler->lock); + fthread_internal_t fthread = threads[i]; + MUTEX_UNLOCK(&scheduler->lock); + set_current_thread(scheduler->worker_thread); + fthread_unyield(fthread); + fthread_waitfor(fthread); + + for (size_t j = 0; j < thread_count; j++) { + if (i == j) { + continue; + } + fthread_set_block_state(threads[j], false); + } + + free(threads); + } +} +fthread_schedule_algorithm_t fthread_random_unblocked = fthread_schedule_random_unblocked; + +#pragma mark - Scheduler + +/*! Main function for the scheduler's worker thread. + */ +static void *fthread_scheduler_main(fthread_scheduler_t *scheduler) { + set_current_thread(scheduler->worker_thread); + fthread_yield_thread(scheduler->worker_thread); + FTHREAD_DEBUG("Scheduler started\n"); + MUTEX_LOCK(&scheduler->lock); + void (*algorithm)(fthread_scheduler_t *) = scheduler->algorithm; + MUTEX_UNLOCK(&scheduler->lock); + algorithm(scheduler); + + FTHREAD_DEBUG("Scheduler finished\n"); + scheduler->worker_thread->is_finished = true; + semaphore_signal_without_aborting(scheduler->worker_thread->signal_to_yield); + get_machine()->thread_exit(NULL); + return NULL; +} + +void fthread_run(fthread_schedule_algorithm_t algo, void *algo_data) { + FTHREAD_DEBUG("Main Start\n"); + + fthread_scheduler_t *scheduler = &__scheduler; + MUTEX_LOCK(&scheduler->lock); + assert(scheduler->worker_thread == NULL); + if (scheduler->worker_thread == NULL) { + must(fthread_scheduler_create(&scheduler->worker_thread, + THREAD_FN(&fthread_scheduler_main), + scheduler), + "Failed to create scheduler thread."); + } + scheduler->algorithm = algo; + scheduler->algorithm_data = algo_data; + fthread_internal_t scheduler_thread = scheduler->worker_thread; + MUTEX_UNLOCK(&scheduler->lock); + // "fake" fthread for debugging purposes (to see which threads it yields) +#ifdef FOX_LOG_THREADS + fthread_internal_t t = FOXCalloc(sizeof(struct __fthread), 1); + t->name = "Main"; + set_current_thread(t); +#endif + fthread_unyield(scheduler_thread); +} + +void fthread_wait(void) { + fthread_scheduler_t *scheduler = &__scheduler; + MUTEX_LOCK(&scheduler->lock); + fthread_internal_t scheduler_thread = scheduler->worker_thread; + MUTEX_UNLOCK(&scheduler->lock); + fthread_waitfor(scheduler_thread); +#ifdef FOX_LOG_THREADS + free(get_current_thread()); + set_current_thread(NULL); +#endif + FTHREAD_DEBUG("Main: Finished\n"); +} + +void fthread_run_and_wait(fthread_schedule_algorithm_t algo, void *algo_data) { + fthread_run(algo, algo_data); + fthread_wait(); +} + +/*! Adds a given fthread to the scheduler's internal list of threads. + * Threadsafe. + */ +static void fthread_list_add(fthread_scheduler_t *scheduler, fthread_internal_t thread) { + FTHREAD_DEBUG("Adding thread %s\n", thread->name); + MUTEX_LOCK(&scheduler->lock); + if (scheduler->capacity == scheduler->num_threads) { + unsigned int new_cap = MAX(scheduler->capacity * 2, 10); + scheduler->threads = FOXRealloc(scheduler->threads, sizeof(fthread_internal_t *) * new_cap); + scheduler->capacity = new_cap; + } + scheduler->threads[scheduler->num_threads++] = thread; + MUTEX_UNLOCK(&scheduler->lock); +} + +/*! Gets the fthread for the given pthread_t type from the scheduler. + * Threadsafe. + * + * Inefficient, but there usually isn't too many threads to keep track of, so + * it is OK. + */ +static fthread_internal_t fthread_list_get(fthread_scheduler_t *scheduler, pthread_t pthread) { + fox_machine_t *machine = get_machine(); + fthread_internal_t fthread = NULL; + MUTEX_LOCK(&scheduler->lock); + for (unsigned int i = 0; i < scheduler->num_threads; i++) { + if (machine->thread_equal(pthread, scheduler->threads[i]->pthread)) { + fthread = scheduler->threads[i]; + break; + } + } + MUTEX_UNLOCK(&scheduler->lock); + return fthread; +} + +#pragma mark - Threads + +static void fthread_free(fthread_internal_t fthread) { + if (fthread != NULL) { + fox_machine_t *machine = get_machine(); + machine->semaphore_destroy(mach_task_self(), fthread->signal_to_unyield); + machine->semaphore_destroy(mach_task_self(), fthread->signal_to_yield); + free(fthread->name); + free(fthread); + } +} + +static bool fthread_set_block_state(fthread_internal_t fthread, bool state) { + if (fthread) { + MUTEX_LOCK(&fthread->state_lock); + bool original_value = fthread->is_blocked; + fthread->is_blocked = state; + MUTEX_UNLOCK(&fthread->state_lock); + return original_value; + } + return false; +} + + +/*! Cooperatively yields the current thread represented as fthread_t. + * + * Blocks the current thread until it is unyielded by another thread. + * + * Signals thread's signal_to_yield field. + * Waits on thread's signal_to_unyield field. + */ +static void fthread_yield_thread(fthread_internal_t fthread) { + if (fthread) { + MUTEX_LOCK(&fthread->state_lock); + if (fthread->is_finished) { + MUTEX_UNLOCK(&fthread->state_lock); + return; + } + if (fthread->is_not_first_call) { + FTHREAD_DEBUG("[%s] yields\n", fthread->name); + MUTEX_UNLOCK(&fthread->state_lock); + semaphore_signal_without_aborting(fthread->signal_to_yield); + } else { + fthread->is_not_first_call = true; + MUTEX_UNLOCK(&fthread->state_lock); + } + semaphore_wait_without_aborting(fthread->signal_to_unyield); + FTHREAD_DEBUG("[%s] resumes\n", fthread->name); + } +} + + +/*! Yields the current thread. Forces the scheduler to continue execution on + * another thread. This should be called when inside a code that is waiting + * for a resource that another thread holds (eg - locks). + */ +static void fthread_blocking_yield(void) { + fthread_internal_t current_thread = (fthread_internal_t)fthread_current(); + + if (current_thread) { + fthread_set_block_state(current_thread, true); + fthread_yield_thread(current_thread); + fthread_set_block_state(current_thread, false); + } +} + +/*! Unyields the given thread represented as fthread_t. Does not block the + * current thread. + * + * Use fthread_waitfor() to block. + */ +void fthread_unyield(fthread_t ft) { + fthread_internal_t fthread = (fthread_internal_t)ft; + FTHREAD_DEBUG("[%s] unyields [%s]\n", get_current_thread()->name, fthread->name); + semaphore_signal_without_aborting(fthread->signal_to_unyield); +} + +/*! Waits for the given thread represented as fthread_t. Blocks the current + * thread until that thread calls fthread_yield(). + */ +void fthread_waitfor(fthread_t ft) { + fthread_internal_t fthread = (fthread_internal_t)ft; + FTHREAD_DEBUG("[%s] waitsfor [%s]\n", get_current_thread()->name, fthread->name); + semaphore_wait_without_aborting(fthread->signal_to_yield); +} + +/*! Yields the current thread. Blocks the thread until it is unyield with + * fthread_unyield(..); + */ +void fthread_yield(void) { + fthread_yield_thread(fthread_current()); +} + +/* Returns the opaque type of the current thread. + * + * Unlike get_current_thread(), this will return NULL for the main thread. + */ +fthread_t fthread_current(void) { + fthread_internal_t fthread = get_current_thread(); + if (fthread == NULL || strncmp(fthread->name, "Main", sizeof("Main")) == 0) { + return NULL; + } + return fthread; +} + +/*! Converts a pthread_t to its equivalent fthread_t if possible. + * Threadsafe. + */ +fthread_t fthread_get(pthread_t pthread) { + return fthread_list_get(&__scheduler, pthread); +} + +/*! Returns true if the current thread has finished executed. + * Threadsafe. + */ +static bool fthread_is_complete(fthread_internal_t fthread) { + MUTEX_LOCK(&fthread->state_lock); + bool is_complete = fthread->is_finished; + MUTEX_UNLOCK(&fthread->state_lock); + return is_complete; +} + +/*! Returns true if the current thread has finished executed or not blocked. + * Threadsafe. + */ +static bool fthread_is_blocked(fthread_internal_t fthread) { + if (fthread) { + MUTEX_LOCK(&fthread->state_lock); + bool is_blocked = fthread->is_blocked; + MUTEX_UNLOCK(&fthread->state_lock); + return is_blocked; + } + return true; +} + + +/*! Main function for the threads fox manages. + */ +static void *fthread_main(fthread_internal_t fthread) { + set_current_thread(fthread); + void *result = fthread->user_main(fthread->user_data); + MUTEX_LOCK(&fthread->state_lock); + fthread->is_finished = true; + MUTEX_UNLOCK(&fthread->state_lock); + FTHREAD_DEBUG("[%s] exits normally\n", fthread->name); + return result; +} + +/*! Creates the scheduler thread. + */ +static int fthread_scheduler_create(fthread_internal_t *fthread_ptr, void *(*thread_main)(void *), void *thread_data) { + fox_machine_t *machine = get_machine(); + + int result = 0; + fthread_internal_t fthread = (fthread_internal_t)FOXCalloc(sizeof(struct __fthread), 1); + fthread->user_main = thread_main; + fthread->user_data = thread_data; + fthread->is_blocked = false; + fthread->is_finished = false; + fthread->name = FOXCStringOnHeap("fox.scheduler.%p", fthread); + fthread->state_lock = 0; + + _semaphore_create(&fthread->signal_to_unyield); + _semaphore_create(&fthread->signal_to_yield); + + result = machine->thread_create(&fthread->pthread, NULL, thread_main, thread_data); + if (result) { + fthread_free(fthread); + } else { + *fthread_ptr = fthread; + } + return result; +} + +/*! Creates a thread by the request of the api consumer. + * Overrides pthread_create(...) + */ +int fthread_create(pthread_t *pthread, pthread_attr_t *attr, void *(*thread_main)(void *), void *thread_data) { + fox_machine_t *machine = get_machine(); + + int result = 0; + if (__use_fox_implementation) { + fthread_internal_t fthread = FOXCalloc(sizeof(struct __fthread), 1); + fthread->user_main = thread_main; + fthread->user_data = thread_data; + fthread->is_blocked = false; + fthread->is_finished = false; + fthread->state_lock = 0; + fthread->name = FOXCStringOnHeap("fox.thread.%u", next_thread_number()); + + _semaphore_create(&fthread->signal_to_unyield); + _semaphore_create(&fthread->signal_to_yield); + + result = machine->thread_create(pthread, attr, THREAD_FN(fthread_main), fthread); + if (result) { + fthread_free(fthread); + } else { + fthread->pthread = *pthread; + fthread_list_add(&__scheduler, fthread); + } + } else { + result = machine->thread_create(pthread, attr, thread_main, thread_data); + } + return result; +} + +/*! Equivalent to pthread_detach(...) + */ +int fthread_detach(pthread_t pthread) { + return get_machine()->thread_detach(pthread); +} + +/*! Equivalent to pthread_exit(...) + */ +void fthread_exit(void *data) { + fthread_internal_t fthread = get_current_thread(); + if (fthread) { + MUTEX_LOCK(&fthread->state_lock); + fthread->is_finished = true; + MUTEX_UNLOCK(&fthread->state_lock); + semaphore_signal_without_aborting(fthread->signal_to_yield); + FTHREAD_DEBUG("[%s] exits via pthread_exit()\n", fthread->name); + } + get_machine()->thread_exit(data); +} + +/*! Equivalent to pthread_join(...) + */ +int fthread_join(pthread_t pthread, void **value_ptr) { + int result = 0; + if (__use_fox_implementation) { + // TODO: record blocking yield for a particular thread. + result = get_machine()->thread_join(pthread, value_ptr); + } else { + result = get_machine()->thread_join(pthread, value_ptr); + } + return result; +} + +#pragma mark - POSIX Mutex + +/*! Equivalent to pthread_mutex_lock, but constantly yields instead of just + * blocking. + */ +int fthread_mutex_lock(pthread_mutex_t *mutex) { + fox_machine_t *machine = get_machine(); + int result = 0; + bool use_fox_impl = __use_fox_implementation; +#ifdef FOX_LOG_THREADS + use_fox_impl = false; +#endif + if (use_fox_impl) { + while ((result = machine->mutex_trylock(mutex)) != 0) { + if (result != EBUSY) { + break; + } + fthread_blocking_yield(); + } + } else { + result = machine->mutex_lock(mutex); + } + return result; +} + +#pragma mark - POSIX Cond + +// return 1 if subtraction is negative +static int timespec_subtract(struct timespec *result, struct timespec x, struct timespec y) { + if (x.tv_nsec < y.tv_nsec) { + long nsec = (y.tv_nsec - x.tv_nsec) / 1000000 + 1; + y.tv_nsec -= 1000000 * nsec; + y.tv_sec += nsec; + } + if (x.tv_nsec - y.tv_nsec > 1000000) { + long nsec = (x.tv_nsec - y.tv_nsec) / 1000000; + y.tv_nsec += 1000000 * nsec; + y.tv_sec -= nsec; + } + + result->tv_sec = x.tv_sec - y.tv_sec; + result->tv_nsec = x.tv_nsec - y.tv_nsec; + + return x.tv_sec < y.tv_sec; +} + +/*! Equivalent to pthread_cond_timedwait, but constantly yields instead of just + * blocking until the timeout is reached. + */ +int fthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *timespec) { + fox_machine_t *machine = get_machine(); + int result = 0; + if (__use_fox_implementation) { + struct timespec remaining_timespec = *timespec; + struct timespec deltatime = machine->yield_timespec; + while ((result = machine->cond_timedwait(cond, mutex, &deltatime))) { + if (result != ETIMEDOUT) { + break; + } + + struct timespec new_timespec; + if (timespec_subtract(&new_timespec, remaining_timespec, deltatime)) { + result = ETIMEDOUT; + break; + } else { + remaining_timespec = new_timespec; + fthread_yield(); + } + } + } else { + result = machine->cond_timedwait(cond, mutex, timespec); + } + return result; +} + +/*! Equivalent to pthread_cond_wait, but constantly yields instead of just + * blocking. + */ +int fthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { + fox_machine_t *machine = get_machine(); + int result = 0; + if (__use_fox_implementation) { + struct timespec time = machine->yield_timespec; + while ((result = machine->cond_timedwait(cond, mutex, &time))) { + if (result != ETIMEDOUT) { + break; + } + fthread_blocking_yield(); + } + } else { + result = machine->cond_wait(cond, mutex); + } + return result; +} + +#pragma mark - POSIX Semaphores + +/*! Equivalent to sem_wait, but constantly yields instead of just + * blocking. + */ +int fox_sem_wait(sem_t *sem) { + fox_machine_t *machine = get_machine(); + int result = 0; + if (__use_fox_implementation) { + while ((result = machine->sem_trywait(sem))) { + if (result != EAGAIN) { + break; + } + fthread_blocking_yield(); + } + } else { + result = machine->sem_wait(sem); + } + return result; +} + +#pragma mark - Mach Semaphores + +// return 1 if subtraction is negative +static int mach_timespec_subtract(mach_timespec_t *result, mach_timespec_t x, mach_timespec_t y) { + if (x.tv_nsec < y.tv_nsec) { + long nsec = (y.tv_nsec - x.tv_nsec) / 1000000 + 1; + y.tv_nsec -= 1000000 * nsec; + y.tv_sec += nsec; + } + if (x.tv_nsec - y.tv_nsec > 1000000) { + long nsec = (x.tv_nsec - y.tv_nsec) / 1000000; + y.tv_nsec += 1000000 * nsec; + y.tv_sec -= nsec; + } + + result->tv_sec = x.tv_sec - y.tv_sec; + result->tv_nsec = x.tv_nsec - y.tv_nsec; + + return x.tv_sec < y.tv_sec; +} + +/*! Equivalent to semaphore_timedwait, but constantly yields instead of just + * blocking. + */ +kern_return_t fox_semaphore_timedwait(semaphore_t semaphore, mach_timespec_t wait_time) { + fox_machine_t *machine = get_machine(); + kern_return_t result = 0; + if (__use_fox_implementation) { + mach_timespec_t remaining_timespec = wait_time; + mach_timespec_t deltatime = { + .tv_sec=(unsigned int)machine->yield_timespec.tv_sec, + .tv_nsec=(clock_res_t)machine->yield_timespec.tv_nsec, + }; + while ((result = machine->semaphore_timedwait(semaphore, deltatime))) { + if (result != KERN_OPERATION_TIMED_OUT) { + break; + } + + mach_timespec_t new_timespec; + if (mach_timespec_subtract(&new_timespec, remaining_timespec, deltatime)) { + result = KERN_OPERATION_TIMED_OUT; + break; + } else { + remaining_timespec = new_timespec; + fthread_yield(); + } + } + } else { + result = machine->semaphore_timedwait(semaphore, wait_time); + } + return result; +} + +/*! Equivalent to semaphore_wait, but constantly yields instead of just + * blocking. + */ +kern_return_t fox_semaphore_wait(semaphore_t semaphore) { + fox_machine_t *machine = get_machine(); + kern_return_t result = 0; + if (__use_fox_implementation) { + mach_timespec_t deltatime = { + .tv_sec=(unsigned int)machine->yield_timespec.tv_sec, + .tv_nsec=(clock_res_t)machine->yield_timespec.tv_nsec, + }; + while ((result = machine->semaphore_timedwait(semaphore, deltatime))) { + if (result != KERN_OPERATION_TIMED_OUT) { + break; + } + fthread_blocking_yield(); + } + } else { + result = machine->semaphore_wait(semaphore); + } + return result; +} + +#pragma mark - OSSpinLocks + +/*! Equivalent to OSSpinLockLock, but constantly yields instead of just + * blocking. + */ +void fox_spinlock_lock(volatile OSSpinLock *lock) { + fox_machine_t *machine = get_machine(); + if (__use_fox_implementation) { + while (!machine->spinlock_try(lock)) { + fthread_blocking_yield(); + } + } else { + machine->spinlock_lock(lock); + } +} diff --git a/Fox/Private/Scheduler/FOXThreadMachine.h b/Fox/Private/Scheduler/FOXThreadMachine.h new file mode 100644 index 0000000..95f0a3f --- /dev/null +++ b/Fox/Private/Scheduler/FOXThreadMachine.h @@ -0,0 +1,81 @@ +#import +#import +#import +#import + +// code style: snake case for this file to be more POSIX-styled + +// maintainers: Don't forget to update get_machine() implementation too. +typedef volatile struct { + // timespec fragment to yield. Default is {0 sec, 10 nsec}. + struct timespec yield_timespec; + + // posix threads + int (*thread_create)(pthread_t *thread, + const pthread_attr_t *attrs, + void *(*thread_main)(void *), + void *thread_data); + int (*thread_join)(pthread_t thread, void **value_ptr); + int (*thread_detach)(pthread_t thread); + void (*thread_exit)(void *data); + int (*thread_equal)(pthread_t, pthread_t); + int (*thread_key_create)(pthread_key_t *key, void (*destructor)(void *)); + int (*thread_key_delete)(pthread_key_t key); + int (*thread_once)(pthread_once_t *once, void (*fnptr)(void)); + + int (*mutex_init)(pthread_mutex_t *mutex, const pthread_mutexattr_t *attrs); + int (*mutex_trylock)(pthread_mutex_t *mutex); + int (*mutex_lock)(pthread_mutex_t *mutex); + int (*mutex_unlock)(pthread_mutex_t *mutex); + int (*mutex_destroy)(pthread_mutex_t *mutex); + + int (*cond_init)(pthread_cond_t *cond, const pthread_condattr_t *attrs); + int (*cond_timedwait)(pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *timespec); + int (*cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex); + int (*cond_signal)(pthread_cond_t *cond); + int (*cond_destroy)(pthread_cond_t *cond); + + // posix semaphores + sem_t *(*sem_open)(const char *name, int oflag, ...); + int (*sem_post)(sem_t *sem); + int (*sem_trywait)(sem_t *sem); + int (*sem_wait)(sem_t *sem); + int (*sem_unlink)(const char *name); + int (*sem_close)(sem_t *); + + // mach semaphores + kern_return_t (*semaphore_create)(task_t task, + semaphore_t *semaphore, + int policy, + int value); + kern_return_t (*semaphore_signal)(semaphore_t semaphore); + kern_return_t (*semaphore_signal_all)(semaphore_t semaphore); + kern_return_t (*semaphore_wait)(semaphore_t semaphore); + kern_return_t (*semaphore_timedwait)(semaphore_t semaphore, + mach_timespec_t wait_time); + // ideally, we should support these. But we don't + // kern_return_t (*semaphore_timedwait_signal)(semaphore_t wait_semaphore, + // semaphore_t signal_semaphore, + // mach_timespec_t wait_time); + // kern_return_t (*semaphore_wait_signal)(semaphore_t wait_semaphore, + // semaphore_t signal_semaphore); + // + // kern_return_t (*semaphore_signal_thread)(semaphore_t semaphore, + // thread_t thread); + kern_return_t (*semaphore_destroy)(task_t task, semaphore_t semaphore); + + // libkern + bool (*spinlock_try)(volatile OSSpinLock *__lock); + void (*spinlock_lock)(volatile OSSpinLock *__lock); + void (*spinlock_unlock)(volatile OSSpinLock *__lock); +} fox_machine_t; + +/*! Returns the machinery fox threads uses under the hood. + * None of the fields in this struct should point to fox functions. + * + * @warning modifying this pointer is not thread safe. + * you should only modify this prior to using threads. + */ +fox_machine_t *get_machine(void); diff --git a/Fox/Private/Scheduler/FOXThreadMachine.m b/Fox/Private/Scheduler/FOXThreadMachine.m new file mode 100644 index 0000000..21b4b9c --- /dev/null +++ b/Fox/Private/Scheduler/FOXThreadMachine.m @@ -0,0 +1,47 @@ +#import "FOXThreadMachine.h" +#import "FOXMemory.h" + +static fox_machine_t __machine = { + .yield_timespec = (struct timespec){.tv_sec=0, .tv_nsec=10}, + + .thread_create = &pthread_create, + .thread_join = &pthread_join, + .thread_detach = &pthread_detach, + .thread_exit = &pthread_exit, + .thread_equal = &pthread_equal, + .thread_key_create = &pthread_key_create, + .thread_key_delete = &pthread_key_delete, + .thread_once = &pthread_once, + .mutex_init = &pthread_mutex_init, + .mutex_trylock = &pthread_mutex_trylock, + .mutex_lock = &pthread_mutex_lock, + .mutex_unlock = &pthread_mutex_unlock, + .mutex_destroy = &pthread_mutex_destroy, + .cond_init = &pthread_cond_init, + .cond_timedwait = &pthread_cond_timedwait, + .cond_wait = &pthread_cond_wait, + .cond_signal = &pthread_cond_signal, + .cond_destroy = &pthread_cond_destroy, + + .sem_open = &sem_open, + .sem_post = &sem_post, + .sem_trywait = &sem_trywait, + .sem_wait = &sem_wait, + .sem_unlink = &sem_unlink, + .sem_close = &sem_close, + + .semaphore_create = &semaphore_create, + .semaphore_signal = &semaphore_signal, + .semaphore_signal_all = &semaphore_signal_all, + .semaphore_wait = &semaphore_wait, + .semaphore_timedwait = &semaphore_timedwait, + .semaphore_destroy = &semaphore_destroy, + + .spinlock_try = &OSSpinLockTry, + .spinlock_lock = &OSSpinLockLock, + .spinlock_unlock = &OSSpinLockUnlock, +}; + +fox_machine_t *get_machine(void) { + return &__machine; +} diff --git a/Fox/Private/mach_override/libudis86/decode.c b/Fox/Private/mach_override/libudis86/decode.c new file mode 100755 index 0000000..5b7865f --- /dev/null +++ b/Fox/Private/mach_override/libudis86/decode.c @@ -0,0 +1,1094 @@ +/* udis86 - libudis86/decode.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "udint.h" +#include "types.h" +#include "input.h" +#include "decode.h" + +#ifndef __UD_STANDALONE__ +# include +#endif /* __UD_STANDALONE__ */ + +/* The max number of prefixes to an instruction */ +#define MAX_PREFIXES 15 + +/* rex prefix bits */ +#define REX_W(r) ( ( 0xF & ( r ) ) >> 3 ) +#define REX_R(r) ( ( 0x7 & ( r ) ) >> 2 ) +#define REX_X(r) ( ( 0x3 & ( r ) ) >> 1 ) +#define REX_B(r) ( ( 0x1 & ( r ) ) >> 0 ) +#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \ + ( P_REXR(n) << 2 ) | \ + ( P_REXX(n) << 1 ) | \ + ( P_REXB(n) << 0 ) ) + +/* scable-index-base bits */ +#define SIB_S(b) ( ( b ) >> 6 ) +#define SIB_I(b) ( ( ( b ) >> 3 ) & 7 ) +#define SIB_B(b) ( ( b ) & 7 ) + +/* modrm bits */ +#define MODRM_REG(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_NNN(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_MOD(b) ( ( ( b ) >> 6 ) & 3 ) +#define MODRM_RM(b) ( ( b ) & 7 ) + +static int decode_ext(struct ud *u, uint16_t ptr); + +enum reg_class { /* register classes */ + REGCLASS_NONE, + REGCLASS_GPR, + REGCLASS_MMX, + REGCLASS_CR, + REGCLASS_DB, + REGCLASS_SEG, + REGCLASS_XMM +}; + + +/* + * inp_uint8 + * int_uint16 + * int_uint32 + * int_uint64 + * Load little-endian values from input + */ +static uint8_t +inp_uint8(struct ud* u) +{ + return ud_inp_next(u); +} + +static uint16_t +inp_uint16(struct ud* u) +{ + uint16_t r, ret; + + ret = ud_inp_next(u); + r = ud_inp_next(u); + return ret | (r << 8); +} + +static uint32_t +inp_uint32(struct ud* u) +{ + uint32_t r, ret; + + ret = ud_inp_next(u); + r = ud_inp_next(u); + ret = ret | (r << 8); + r = ud_inp_next(u); + ret = ret | (r << 16); + r = ud_inp_next(u); + return ret | (r << 24); +} + +static uint64_t +inp_uint64(struct ud* u) +{ + uint64_t r, ret; + + ret = ud_inp_next(u); + r = ud_inp_next(u); + ret = ret | (r << 8); + r = ud_inp_next(u); + ret = ret | (r << 16); + r = ud_inp_next(u); + ret = ret | (r << 24); + r = ud_inp_next(u); + ret = ret | (r << 32); + r = ud_inp_next(u); + ret = ret | (r << 40); + r = ud_inp_next(u); + ret = ret | (r << 48); + r = ud_inp_next(u); + return ret | (r << 56); +} + + +static inline int +eff_opr_mode(int dis_mode, int rex_w, int pfx_opr) +{ + if (dis_mode == 64) { + return rex_w ? 64 : (pfx_opr ? 16 : 32); + } else if (dis_mode == 32) { + return pfx_opr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_opr ? 32 : 16; + } +} + + +static inline int +eff_adr_mode(int dis_mode, int pfx_adr) +{ + if (dis_mode == 64) { + return pfx_adr ? 32 : 64; + } else if (dis_mode == 32) { + return pfx_adr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_adr ? 32 : 16; + } +} + + +/* Looks up mnemonic code in the mnemonic string table + * Returns NULL if the mnemonic code is invalid + */ +const char* +ud_lookup_mnemonic(enum ud_mnemonic_code c) +{ + if (c < UD_MAX_MNEMONIC_CODE) { + return ud_mnemonics_str[c]; + } else { + return NULL; + } +} + + +/* + * decode_prefixes + * + * Extracts instruction prefixes. + */ +static int +decode_prefixes(struct ud *u) +{ + int done = 0; + uint8_t curr; + UD_RETURN_ON_ERROR(u); + + do { + ud_inp_next(u); + UD_RETURN_ON_ERROR(u); + if (inp_len(u) == MAX_INSN_LENGTH) { + UD_RETURN_WITH_ERROR(u, "max instruction length"); + } + curr = inp_curr(u); + + switch (curr) + { + case 0x2E : + u->pfx_seg = UD_R_CS; + break; + case 0x36 : + u->pfx_seg = UD_R_SS; + break; + case 0x3E : + u->pfx_seg = UD_R_DS; + break; + case 0x26 : + u->pfx_seg = UD_R_ES; + break; + case 0x64 : + u->pfx_seg = UD_R_FS; + break; + case 0x65 : + u->pfx_seg = UD_R_GS; + break; + case 0x67 : /* adress-size override prefix */ + u->pfx_adr = 0x67; + break; + case 0xF0 : + u->pfx_lock = 0xF0; + break; + case 0x66: + u->pfx_opr = 0x66; + break; + case 0xF2: + u->pfx_str = 0xf2; + break; + case 0xF3: + u->pfx_str = 0xf3; + break; + default: + done = 1; + break; + } + } while (!done); + + if (u->dis_mode == 64 && (curr & 0xF0) == 0x40) { + /* rex prefixes in 64bit mode, must be the last prefix + */ + u->pfx_rex = curr; + } else { + /* rewind back one byte in stream, since the above loop + * stops with a non-prefix byte. + */ + inp_back(u); + } + return 0; +} + + +static inline unsigned int modrm( struct ud * u ) +{ + if ( !u->have_modrm ) { + u->modrm = ud_inp_next( u ); + u->have_modrm = 1; + } + return u->modrm; +} + + +static unsigned int +resolve_operand_size( const struct ud * u, unsigned int s ) +{ + switch ( s ) + { + case SZ_V: + return ( u->opr_mode ); + case SZ_Z: + return ( u->opr_mode == 16 ) ? 16 : 32; + case SZ_Y: + return ( u->opr_mode == 16 ) ? 32 : u->opr_mode; + case SZ_RDQ: + return ( u->dis_mode == 64 ) ? 64 : 32; + default: + return s; + } +} + + +static int resolve_mnemonic( struct ud* u ) +{ + /* resolve 3dnow weirdness. */ + if ( u->mnemonic == UD_I3dnow ) { + u->mnemonic = ud_itab[ u->le->table[ inp_curr( u ) ] ].mnemonic; + } + /* SWAPGS is only valid in 64bits mode */ + if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) { + UDERR(u, "swapgs invalid in 64bits mode"); + return -1; + } + + if (u->mnemonic == UD_Ixchg) { + if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) || + (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) { + u->operand[0].type = UD_NONE; + u->operand[1].type = UD_NONE; + u->mnemonic = UD_Inop; + } + } + + if (u->mnemonic == UD_Inop && u->pfx_repe) { + u->pfx_repe = 0; + u->mnemonic = UD_Ipause; + } + return 0; +} + + +/* ----------------------------------------------------------------------------- + * decode_a()- Decodes operands of the type seg:offset + * ----------------------------------------------------------------------------- + */ +static void +decode_a(struct ud* u, struct ud_operand *op) +{ + if (u->opr_mode == 16) { + /* seg16:off16 */ + op->type = UD_OP_PTR; + op->size = 32; + op->lval.ptr.off = inp_uint16(u); + op->lval.ptr.seg = inp_uint16(u); + } else { + /* seg16:off32 */ + op->type = UD_OP_PTR; + op->size = 48; + op->lval.ptr.off = inp_uint32(u); + op->lval.ptr.seg = inp_uint16(u); + } +} + +/* ----------------------------------------------------------------------------- + * decode_gpr() - Returns decoded General Purpose Register + * ----------------------------------------------------------------------------- + */ +static enum ud_type +decode_gpr(register struct ud* u, unsigned int s, unsigned char rm) +{ + switch (s) { + case 64: + return UD_R_RAX + rm; + case 32: + return UD_R_EAX + rm; + case 16: + return UD_R_AX + rm; + case 8: + if (u->dis_mode == 64 && u->pfx_rex) { + if (rm >= 4) + return UD_R_SPL + (rm-4); + return UD_R_AL + rm; + } else return UD_R_AL + rm; + default: + UD_ASSERT(!"invalid operand size"); + return 0; + } +} + +static void +decode_reg(struct ud *u, + struct ud_operand *opr, + int type, + int num, + int size) +{ + int reg; + size = resolve_operand_size(u, size); + switch (type) { + case REGCLASS_GPR : reg = decode_gpr(u, size, num); break; + case REGCLASS_MMX : reg = UD_R_MM0 + (num & 7); break; + case REGCLASS_XMM : reg = UD_R_XMM0 + num; break; + case REGCLASS_CR : reg = UD_R_CR0 + num; break; + case REGCLASS_DB : reg = UD_R_DR0 + num; break; + case REGCLASS_SEG : { + /* + * Only 6 segment registers, anything else is an error. + */ + if ((num & 7) > 5) { + UDERR(u, "invalid segment register value"); + return; + } else { + reg = UD_R_ES + (num & 7); + } + break; + } + default: + UD_ASSERT(!"invalid register type"); + break; + } + opr->type = UD_OP_REG; + opr->base = reg; + opr->size = size; +} + + +/* + * decode_imm + * + * Decode Immediate values. + */ +static void +decode_imm(struct ud* u, unsigned int size, struct ud_operand *op) +{ + op->size = resolve_operand_size(u, size); + op->type = UD_OP_IMM; + + switch (op->size) { + case 8: op->lval.sbyte = inp_uint8(u); break; + case 16: op->lval.uword = inp_uint16(u); break; + case 32: op->lval.udword = inp_uint32(u); break; + case 64: op->lval.uqword = inp_uint64(u); break; + default: return; + } +} + + +/* + * decode_mem_disp + * + * Decode mem address displacement. + */ +static void +decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op) +{ + switch (size) { + case 8: + op->offset = 8; + op->lval.ubyte = inp_uint8(u); + break; + case 16: + op->offset = 16; + op->lval.uword = inp_uint16(u); + break; + case 32: + op->offset = 32; + op->lval.udword = inp_uint32(u); + break; + case 64: + op->offset = 64; + op->lval.uqword = inp_uint64(u); + break; + default: + return; + } +} + + +/* + * decode_modrm_reg + * + * Decodes reg field of mod/rm byte + * + */ +static inline void +decode_modrm_reg(struct ud *u, + struct ud_operand *operand, + unsigned int type, + unsigned int size) +{ + uint8_t reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u)); + decode_reg(u, operand, type, reg, size); +} + + +/* + * decode_modrm_rm + * + * Decodes rm field of mod/rm byte + * + */ +static void +decode_modrm_rm(struct ud *u, + struct ud_operand *op, + unsigned char type, /* register type */ + unsigned int size) /* operand size */ + +{ + size_t offset = 0; + unsigned char mod, rm; + + /* get mod, r/m and reg fields */ + mod = MODRM_MOD(modrm(u)); + rm = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u)); + + /* + * If mod is 11b, then the modrm.rm specifies a register. + * + */ + if (mod == 3) { + decode_reg(u, op, type, rm, size); + return; + } + + /* + * !11b => Memory Address + */ + op->type = UD_OP_MEM; + op->size = resolve_operand_size(u, size); + + if (u->adr_mode == 64) { + op->base = UD_R_RAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && (rm & 7) == 5) { + op->base = UD_R_RIP; + offset = 32; + } else { + offset = 0; + } + /* + * Scale-Index-Base (SIB) + */ + if ((rm & 7) == 4) { + ud_inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + /* special conditions for base reference */ + if (op->index == UD_R_RSP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + if (op->base == UD_R_RBP || op->base == UD_R_R13) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else if (u->adr_mode == 32) { + op->base = UD_R_EAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && rm == 5) { + op->base = UD_NONE; + offset = 32; + } else { + offset = 0; + } + + /* Scale-Index-Base (SIB) */ + if ((rm & 7) == 4) { + ud_inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + if (op->index == UD_R_ESP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + /* special condition for base reference */ + if (op->base == UD_R_EBP) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else { + const unsigned int bases[] = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP, + UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX }; + const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI, + UD_NONE, UD_NONE, UD_NONE, UD_NONE }; + op->base = bases[rm & 7]; + op->index = indices[rm & 7]; + if (mod == 0 && rm == 6) { + offset = 16; + op->base = UD_NONE; + } else if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 16; + } + } + + if (offset) { + decode_mem_disp(u, (unsigned int)offset, op); + } +} + + +/* + * decode_moffset + * Decode offset-only memory operand + */ +static void +decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr) +{ + opr->type = UD_OP_MEM; + opr->size = resolve_operand_size(u, size); + decode_mem_disp(u, u->adr_mode, opr); +} + + +/* ----------------------------------------------------------------------------- + * decode_operands() - Disassembles Operands. + * ----------------------------------------------------------------------------- + */ +static int +decode_operand(struct ud *u, + struct ud_operand *operand, + enum ud_operand_code type, + unsigned int size) +{ + operand->_oprcode = type; + + switch (type) { + case OP_A : + decode_a(u, operand); + break; + case OP_MR: + decode_modrm_rm(u, operand, REGCLASS_GPR, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_F: + u->br_far = 1; + /* intended fall through */ + case OP_M: + if (MODRM_MOD(modrm(u)) == 3) { + UDERR(u, "expected modrm.mod != 3"); + } + /* intended fall through */ + case OP_E: + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_G: + decode_modrm_reg(u, operand, REGCLASS_GPR, size); + break; + case OP_sI: + case OP_I: + decode_imm(u, size, operand); + break; + case OP_I1: + operand->type = UD_OP_CONST; + operand->lval.udword = 1; + break; + case OP_N: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3"); + } + /* intended fall through */ + case OP_Q: + decode_modrm_rm(u, operand, REGCLASS_MMX, size); + break; + case OP_P: + decode_modrm_reg(u, operand, REGCLASS_MMX, size); + break; + case OP_U: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3"); + } + /* intended fall through */ + case OP_W: + decode_modrm_rm(u, operand, REGCLASS_XMM, size); + break; + case OP_V: + decode_modrm_reg(u, operand, REGCLASS_XMM, size); + break; + case OP_MU: + decode_modrm_rm(u, operand, REGCLASS_XMM, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_S: + decode_modrm_reg(u, operand, REGCLASS_SEG, size); + break; + case OP_O: + decode_moffset(u, size, operand); + break; + case OP_R0: + case OP_R1: + case OP_R2: + case OP_R3: + case OP_R4: + case OP_R5: + case OP_R6: + case OP_R7: + decode_reg(u, operand, REGCLASS_GPR, + (REX_B(u->pfx_rex) << 3) | (type - OP_R0), size); + break; + case OP_AL: + case OP_AX: + case OP_eAX: + case OP_rAX: + decode_reg(u, operand, REGCLASS_GPR, 0, size); + break; + case OP_CL: + case OP_CX: + case OP_eCX: + decode_reg(u, operand, REGCLASS_GPR, 1, size); + break; + case OP_DL: + case OP_DX: + case OP_eDX: + decode_reg(u, operand, REGCLASS_GPR, 2, size); + break; + case OP_ES: + case OP_CS: + case OP_DS: + case OP_SS: + case OP_FS: + case OP_GS: + /* in 64bits mode, only fs and gs are allowed */ + if (u->dis_mode == 64) { + if (type != OP_FS && type != OP_GS) { + UDERR(u, "invalid segment register in 64bits"); + } + } + operand->type = UD_OP_REG; + operand->base = (type - OP_ES) + UD_R_ES; + operand->size = 16; + break; + case OP_J : + decode_imm(u, size, operand); + operand->type = UD_OP_JIMM; + break ; + case OP_R : + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3"); + } + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_C: + decode_modrm_reg(u, operand, REGCLASS_CR, size); + break; + case OP_D: + decode_modrm_reg(u, operand, REGCLASS_DB, size); + break; + case OP_I3 : + operand->type = UD_OP_CONST; + operand->lval.sbyte = 3; + break; + case OP_ST0: + case OP_ST1: + case OP_ST2: + case OP_ST3: + case OP_ST4: + case OP_ST5: + case OP_ST6: + case OP_ST7: + operand->type = UD_OP_REG; + operand->base = (type - OP_ST0) + UD_R_ST0; + operand->size = 80; + break; + default : + break; + } + return 0; +} + + +/* + * decode_operands + * + * Disassemble upto 3 operands of the current instruction being + * disassembled. By the end of the function, the operand fields + * of the ud structure will have been filled. + */ +static int +decode_operands(struct ud* u) +{ + decode_operand(u, &u->operand[0], + u->itab_entry->operand1.type, + u->itab_entry->operand1.size); + decode_operand(u, &u->operand[1], + u->itab_entry->operand2.type, + u->itab_entry->operand2.size); + decode_operand(u, &u->operand[2], + u->itab_entry->operand3.type, + u->itab_entry->operand3.size); + return 0; +} + +/* ----------------------------------------------------------------------------- + * clear_insn() - clear instruction structure + * ----------------------------------------------------------------------------- + */ +static void +clear_insn(register struct ud* u) +{ + u->error = 0; + u->pfx_seg = 0; + u->pfx_opr = 0; + u->pfx_adr = 0; + u->pfx_lock = 0; + u->pfx_repne = 0; + u->pfx_rep = 0; + u->pfx_repe = 0; + u->pfx_rex = 0; + u->pfx_str = 0; + u->mnemonic = UD_Inone; + u->itab_entry = NULL; + u->have_modrm = 0; + u->br_far = 0; + + memset( &u->operand[ 0 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 1 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 2 ], 0, sizeof( struct ud_operand ) ); +} + + +static inline int +resolve_pfx_str(struct ud* u) +{ + if (u->pfx_str == 0xf3) { + if (P_STR(u->itab_entry->prefix)) { + u->pfx_rep = 0xf3; + } else { + u->pfx_repe = 0xf3; + } + } else if (u->pfx_str == 0xf2) { + u->pfx_repne = 0xf3; + } + return 0; +} + + +static int +resolve_mode( struct ud* u ) +{ + /* if in error state, bail out */ + if ( u->error ) return -1; + + /* propagate prefix effects */ + if ( u->dis_mode == 64 ) { /* set 64bit-mode flags */ + + /* Check validity of instruction m64 */ + if ( P_INV64( u->itab_entry->prefix ) ) { + UDERR(u, "instruction invalid in 64bits"); + return -1; + } + + /* effective rex prefix is the effective mask for the + * instruction hard-coded in the opcode map. + */ + u->pfx_rex = ( u->pfx_rex & 0x40 ) | + ( u->pfx_rex & REX_PFX_MASK( u->itab_entry->prefix ) ); + + /* whether this instruction has a default operand size of + * 64bit, also hardcoded into the opcode map. + */ + u->default64 = P_DEF64( u->itab_entry->prefix ); + /* calculate effective operand size */ + if ( REX_W( u->pfx_rex ) ) { + u->opr_mode = 64; + } else if ( u->pfx_opr ) { + u->opr_mode = 16; + } else { + /* unless the default opr size of instruction is 64, + * the effective operand size in the absence of rex.w + * prefix is 32. + */ + u->opr_mode = ( u->default64 ) ? 64 : 32; + } + + /* calculate effective address size */ + u->adr_mode = (u->pfx_adr) ? 32 : 64; + } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 16 : 32; + u->adr_mode = ( u->pfx_adr ) ? 16 : 32; + } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 32 : 16; + u->adr_mode = ( u->pfx_adr ) ? 32 : 16; + } + + /* set flags for implicit addressing */ + u->implicit_addr = P_IMPADDR( u->itab_entry->prefix ); + + return 0; +} + + +static inline int +decode_insn(struct ud *u, uint16_t ptr) +{ + UD_ASSERT((ptr & 0x8000) == 0); + u->itab_entry = &ud_itab[ ptr ]; + u->mnemonic = u->itab_entry->mnemonic; + return (resolve_pfx_str(u) == 0 && + resolve_mode(u) == 0 && + decode_operands(u) == 0 && + resolve_mnemonic(u) == 0) ? 0 : -1; +} + + +/* + * decode_3dnow() + * + * Decoding 3dnow is a little tricky because of its strange opcode + * structure. The final opcode disambiguation depends on the last + * byte that comes after the operands have been decoded. Fortunately, + * all 3dnow instructions have the same set of operand types. So we + * go ahead and decode the instruction by picking an arbitrarily chosen + * valid entry in the table, decode the operands, and read the final + * byte to resolve the menmonic. + */ +static inline int +decode_3dnow(struct ud* u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW); + UD_ASSERT(u->le->table[0xc] != 0); + decode_insn(u, u->le->table[0xc]); + ud_inp_next(u); + if (u->error) { + return -1; + } + ptr = u->le->table[inp_curr(u)]; + UD_ASSERT((ptr & 0x8000) == 0); + u->mnemonic = ud_itab[ptr].mnemonic; + return 0; +} + + +static int +decode_ssepfx(struct ud *u) +{ + uint8_t idx; + uint8_t pfx; + + /* + * String prefixes (f2, f3) take precedence over operand + * size prefix (66). + */ + pfx = u->pfx_str; + if (pfx == 0) { + pfx = u->pfx_opr; + } + idx = ((pfx & 0xf) + 1) / 2; + if (u->le->table[idx] == 0) { + idx = 0; + } + if (idx && u->le->table[idx] != 0) { + /* + * "Consume" the prefix as a part of the opcode, so it is no + * longer exported as an instruction prefix. + */ + u->pfx_str = 0; + if (pfx == 0x66) { + /* + * consume "66" only if it was used for decoding, leaving + * it to be used as an operands size override for some + * simd instructions. + */ + u->pfx_opr = 0; + } + } + return decode_ext(u, u->le->table[idx]); +} + + +/* + * decode_ext() + * + * Decode opcode extensions (if any) + */ +static int +decode_ext(struct ud *u, uint16_t ptr) +{ + uint8_t idx = 0; + if ((ptr & 0x8000) == 0) { + return decode_insn(u, ptr); + } + u->le = &ud_lookup_table_list[(~0x8000 & ptr)]; + if (u->le->type == UD_TAB__OPC_3DNOW) { + return decode_3dnow(u); + } + + switch (u->le->type) { + case UD_TAB__OPC_MOD: + /* !11 = 0, 11 = 1 */ + idx = (MODRM_MOD(modrm(u)) + 1) / 4; + break; + /* disassembly mode/operand size/address size based tables. + * 16 = 0,, 32 = 1, 64 = 2 + */ + case UD_TAB__OPC_MODE: + idx = u->dis_mode != 64 ? 0 : 1; + break; + case UD_TAB__OPC_OSIZE: + idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32; + break; + case UD_TAB__OPC_ASIZE: + idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32; + break; + case UD_TAB__OPC_X87: + idx = modrm(u) - 0xC0; + break; + case UD_TAB__OPC_VENDOR: + if (u->vendor == UD_VENDOR_ANY) { + /* choose a valid entry */ + idx = (u->le->table[idx] != 0) ? 0 : 1; + } else if (u->vendor == UD_VENDOR_AMD) { + idx = 0; + } else { + idx = 1; + } + break; + case UD_TAB__OPC_RM: + idx = MODRM_RM(modrm(u)); + break; + case UD_TAB__OPC_REG: + idx = MODRM_REG(modrm(u)); + break; + case UD_TAB__OPC_SSE: + return decode_ssepfx(u); + default: + UD_ASSERT(!"not reached"); + break; + } + + return decode_ext(u, u->le->table[idx]); +} + + +static int +decode_opcode(struct ud *u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE); + ud_inp_next(u); + if (u->error) { + return -1; + } + u->primary_opcode = inp_curr(u); + ptr = u->le->table[inp_curr(u)]; + if (ptr & 0x8000) { + u->le = &ud_lookup_table_list[ptr & ~0x8000]; + if (u->le->type == UD_TAB__OPC_TABLE) { + return decode_opcode(u); + } + } + return decode_ext(u, ptr); +} + + +/* ============================================================================= + * ud_decode() - Instruction decoder. Returns the number of bytes decoded. + * ============================================================================= + */ +unsigned int +ud_decode(struct ud *u) +{ + inp_start(u); + clear_insn(u); + u->le = &ud_lookup_table_list[0]; + u->error = decode_prefixes(u) == -1 || + decode_opcode(u) == -1 || + u->error; + /* Handle decode error. */ + if (u->error) { + /* clear out the decode data. */ + clear_insn(u); + /* mark the sequence of bytes as invalid. */ + u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */ + u->mnemonic = u->itab_entry->mnemonic; + } + + /* maybe this stray segment override byte + * should be spewed out? + */ + if ( !P_SEG( u->itab_entry->prefix ) && + u->operand[0].type != UD_OP_MEM && + u->operand[1].type != UD_OP_MEM ) + u->pfx_seg = 0; + + u->insn_offset = u->pc; /* set offset of instruction */ + u->asm_buf_fill = 0; /* set translation buffer index to 0 */ + u->pc += u->inp_ctr; /* move program counter by bytes decoded */ + + /* return number of bytes disassembled. */ + return u->inp_ctr; +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/decode.h b/Fox/Private/mach_override/libudis86/decode.h new file mode 100755 index 0000000..a7362c8 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/decode.h @@ -0,0 +1,195 @@ +/* udis86 - libudis86/decode.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_DECODE_H +#define UD_DECODE_H + +#include "types.h" +#include "itab.h" + +#define MAX_INSN_LENGTH 15 + +/* itab prefix bits */ +#define P_none ( 0 ) +#define P_cast ( 1 << 0 ) +#define P_CAST(n) ( ( n >> 0 ) & 1 ) +#define P_rexb ( 1 << 1 ) +#define P_REXB(n) ( ( n >> 1 ) & 1 ) +#define P_inv64 ( 1 << 4 ) +#define P_INV64(n) ( ( n >> 4 ) & 1 ) +#define P_rexw ( 1 << 5 ) +#define P_REXW(n) ( ( n >> 5 ) & 1 ) +#define P_def64 ( 1 << 7 ) +#define P_DEF64(n) ( ( n >> 7 ) & 1 ) +#define P_rexr ( 1 << 8 ) +#define P_REXR(n) ( ( n >> 8 ) & 1 ) +#define P_oso ( 1 << 9 ) +#define P_OSO(n) ( ( n >> 9 ) & 1 ) +#define P_aso ( 1 << 10 ) +#define P_ASO(n) ( ( n >> 10 ) & 1 ) +#define P_rexx ( 1 << 11 ) +#define P_REXX(n) ( ( n >> 11 ) & 1 ) +#define P_ImpAddr ( 1 << 12 ) +#define P_IMPADDR(n) ( ( n >> 12 ) & 1 ) +#define P_seg ( 1 << 13 ) +#define P_SEG(n) ( ( n >> 13 ) & 1 ) +#define P_str ( 1 << 14 ) +#define P_STR(n) ( ( n >> 14 ) & 1 ) +#define P_strz ( 1 << 15 ) +#define P_STR_ZF(n) ( ( n >> 15 ) & 1 ) + +/* operand type constants -- order is important! */ + +enum ud_operand_code { + OP_NONE, + + OP_A, OP_E, OP_M, OP_G, + OP_I, OP_F, + + OP_R0, OP_R1, OP_R2, OP_R3, + OP_R4, OP_R5, OP_R6, OP_R7, + + OP_AL, OP_CL, OP_DL, + OP_AX, OP_CX, OP_DX, + OP_eAX, OP_eCX, OP_eDX, + OP_rAX, OP_rCX, OP_rDX, + + OP_ES, OP_CS, OP_SS, OP_DS, + OP_FS, OP_GS, + + OP_ST0, OP_ST1, OP_ST2, OP_ST3, + OP_ST4, OP_ST5, OP_ST6, OP_ST7, + + OP_J, OP_S, OP_O, + OP_I1, OP_I3, OP_sI, + + OP_V, OP_W, OP_Q, OP_P, + OP_U, OP_N, OP_MU, + + OP_R, OP_C, OP_D, + + OP_MR +} UD_ATTR_PACKED; + + +/* operand size constants */ + +enum ud_operand_size { + SZ_NA = 0, + SZ_Z = 1, + SZ_V = 2, + SZ_RDQ = 7, + + /* the following values are used as is, + * and thus hard-coded. changing them + * will break internals + */ + SZ_B = 8, + SZ_W = 16, + SZ_D = 32, + SZ_Q = 64, + SZ_T = 80, + SZ_O = 128, + + SZ_Y = 17, + + /* + * complex size types, that encode sizes for operands + * of type MR (memory or register), for internal use + * only. Id space 256 and above. + */ + SZ_BD = (SZ_B << 8) | SZ_D, + SZ_BV = (SZ_B << 8) | SZ_V, + SZ_WD = (SZ_W << 8) | SZ_D, + SZ_WV = (SZ_W << 8) | SZ_V, + SZ_WY = (SZ_W << 8) | SZ_Y, + SZ_DY = (SZ_D << 8) | SZ_Y, + SZ_WO = (SZ_W << 8) | SZ_O, + SZ_DO = (SZ_D << 8) | SZ_O, + SZ_QO = (SZ_Q << 8) | SZ_O, + +} UD_ATTR_PACKED; + + +/* resolve complex size type. + */ +static inline enum ud_operand_size +Mx_mem_size(enum ud_operand_size size) +{ + return (size >> 8) & 0xff; +} + +static inline enum ud_operand_size +Mx_reg_size(enum ud_operand_size size) +{ + return size & 0xff; +} + +/* A single operand of an entry in the instruction table. + * (internal use only) + */ +struct ud_itab_entry_operand +{ + enum ud_operand_code type; + enum ud_operand_size size; +}; + + +/* A single entry in an instruction table. + *(internal use only) + */ +struct ud_itab_entry +{ + enum ud_mnemonic_code mnemonic; + struct ud_itab_entry_operand operand1; + struct ud_itab_entry_operand operand2; + struct ud_itab_entry_operand operand3; + uint32_t prefix; +}; + +struct ud_lookup_table_list_entry { + const uint16_t *table; + enum ud_table_type type; + const char *meta; +}; + + + +static inline int +ud_opcode_field_sext(uint8_t primary_opcode) +{ + return (primary_opcode & 0x02) != 0; +} + +extern struct ud_itab_entry ud_itab[]; +extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; + +#endif /* UD_DECODE_H */ + +/* vim:cindent + * vim:expandtab + * vim:ts=4 + * vim:sw=4 + */ diff --git a/Fox/Private/mach_override/libudis86/extern.h b/Fox/Private/mach_override/libudis86/extern.h new file mode 100755 index 0000000..6dc1729 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/extern.h @@ -0,0 +1,103 @@ +/* udis86 - libudis86/extern.h + * + * Copyright (c) 2002-2009, 2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_EXTERN_H +#define UD_EXTERN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "types.h" + +/* ============================= PUBLIC API ================================= */ + +extern void ud_init(struct ud*); + +extern void ud_set_mode(struct ud*, uint8_t); + +extern void ud_set_pc(struct ud*, uint64_t); + +extern void ud_set_input_hook(struct ud*, int (*)(struct ud*)); + +extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); + +#ifndef __UD_STANDALONE__ +extern void ud_set_input_file(struct ud*, FILE*); +#endif /* __UD_STANDALONE__ */ + +extern void ud_set_vendor(struct ud*, unsigned); + +extern void ud_set_syntax(struct ud*, void (*)(struct ud*)); + +extern void ud_input_skip(struct ud*, size_t); + +extern int ud_input_end(const struct ud*); + +extern unsigned int ud_decode(struct ud*); + +extern unsigned int ud_disassemble(struct ud*); + +extern void ud_translate_intel(struct ud*); + +extern void ud_translate_att(struct ud*); + +extern const char* ud_insn_asm(const struct ud* u); + +extern const uint8_t* ud_insn_ptr(const struct ud* u); + +extern uint64_t ud_insn_off(const struct ud*); + +extern const char* ud_insn_hex(struct ud*); + +extern unsigned int ud_insn_len(const struct ud* u); + +extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); + +extern int ud_opr_is_sreg(const struct ud_operand *opr); + +extern int ud_opr_isgpr(const struct ud_operand *opr); + +extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); + +extern void ud_set_user_opaque_data(struct ud*, void*); + +extern void* ud_get_user_opaque_data(const struct ud*); + +extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*); + +extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); + +extern void ud_set_sym_resolver(struct ud *u, + const char* (*resolver)(struct ud*, + uint64_t addr, + int64_t *offset)); + +/* ========================================================================== */ + +#ifdef __cplusplus +} +#endif +#endif /* UD_EXTERN_H */ diff --git a/Fox/Private/mach_override/libudis86/input.c b/Fox/Private/mach_override/libudis86/input.c new file mode 100755 index 0000000..58457a5 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/input.c @@ -0,0 +1,175 @@ +/* udis86 - libudis86/input.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "extern.h" +#include "types.h" +#include "input.h" +#include "udint.h" + +/* + * inp_init + * Initializes the input system. + */ +static void +inp_init(struct ud *u) +{ + u->inp_curr = 0; + u->inp_fill = 0; + u->inp_ctr = 0; + u->inp_end = 0; +} + + +/* ----------------------------------------------------------------------------- + * inp_buff_hook() - Hook for buffered inputs. + * ----------------------------------------------------------------------------- + */ +static int +inp_buff_hook(struct ud* u) +{ + if (u->inp_buff < u->inp_buff_end) + return *u->inp_buff++; + else return -1; +} + +#ifndef __UD_STANDALONE__ +/* ----------------------------------------------------------------------------- + * inp_file_hook() - Hook for FILE inputs. + * ----------------------------------------------------------------------------- + */ +static int +inp_file_hook(struct ud* u) +{ + return fgetc(u->inp_file); +} +#endif /* __UD_STANDALONE__*/ + +/* ============================================================================= + * ud_inp_set_hook() - Sets input hook. + * ============================================================================= + */ +void +ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*)) +{ + u->inp_hook = hook; + inp_init(u); +} + +/* ============================================================================= + * ud_inp_set_buffer() - Set buffer as input. + * ============================================================================= + */ +void +ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len) +{ + u->inp_hook = inp_buff_hook; + u->inp_buff = buf; + u->inp_buff_end = buf + len; + inp_init(u); +} + +#ifndef __UD_STANDALONE__ +/* ============================================================================= + * ud_input_set_file() - Set buffer as input. + * ============================================================================= + */ +void +ud_set_input_file(register struct ud* u, FILE* f) +{ + u->inp_hook = inp_file_hook; + u->inp_file = f; + inp_init(u); +} +#endif /* __UD_STANDALONE__ */ + +/* ============================================================================= + * ud_input_skip() - Skip n input bytes. + * ============================================================================= + */ +void +ud_input_skip(struct ud* u, size_t n) +{ + while (n--) { + u->inp_hook(u); + } +} + +/* ============================================================================= + * ud_input_end() - Test for end of input. + * ============================================================================= + */ +int +ud_input_end(const struct ud* u) +{ + return (u->inp_curr == u->inp_fill) && u->inp_end; +} + + +/* + * ud_inp_next + * Loads and returns the next byte from input. + * + * inp_curr and inp_fill are pointers to the cache. The program is + * written based on the property that they are 8-bits in size, and + * will eventually wrap around forming a circular buffer. So, the + * size of the cache is 256 in size, kind of unnecessary yet + * optimal. + * + * A buffer inp_sess stores the bytes disassembled for a single + * session. + */ +uint8_t +ud_inp_next(struct ud* u) +{ + int c = -1; + /* if current pointer is not upto the fill point in the + * input cache. + */ + if (u->inp_curr != u->inp_fill) { + c = u->inp_cache[ ++u->inp_curr ]; + /* if !end-of-input, call the input hook and get a byte */ + } else if (u->inp_end || (c = u->inp_hook(u)) == -1) { + /* end-of-input, mark it as an error, since the decoder, + * expected a byte more. + */ + UDERR(u, "byte expected, eoi received"); + /* flag end of input */ + u->inp_end = 1; + return 0; + } else { + /* increment pointers, we have a new byte. */ + u->inp_curr = ++u->inp_fill; + /* add the byte to the cache */ + u->inp_cache[u->inp_fill] = c; + } + /* record bytes input per decode-session. */ + u->inp_sess[u->inp_ctr++] = c; + /* return byte */ + return (uint8_t) c; +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/input.h b/Fox/Private/mach_override/libudis86/input.h new file mode 100755 index 0000000..a4ee7f5 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/input.h @@ -0,0 +1,116 @@ +/* udis86 - libudis86/input.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_INPUT_H +#define UD_INPUT_H + +#include "types.h" +#include "udint.h" + +uint8_t ud_inp_next(struct ud* u); + +/* + * inp_start + * Should be called before each de-code operation. + */ +static inline void +inp_start(struct ud *u) +{ + u->inp_ctr = 0; +} + +/* inp_reset + * Resets the current pointer to its position before the current + * instruction disassembly was started. + */ +static inline void +inp_reset(struct ud *u) +{ + u->inp_curr -= u->inp_ctr; + u->inp_ctr = 0; +} + +/* inp_sess + * Returns the pointer to current session. + */ +static inline uint8_t* +inp_sess(struct ud *u) +{ + return u->inp_sess; +} + +/* + * inp_curr + * Returns the current input byte. + */ +static inline uint8_t +inp_curr(const struct ud *u) +{ + return u->inp_cache[u->inp_curr]; +} + +/* + * inp_back + * Move back a single byte in the stream. + */ +static inline void +inp_back(struct ud* u) +{ + if (u->inp_ctr > 0) { + --u->inp_curr; + --u->inp_ctr; + } +} + +/* + * inp_peek + * Peek next byte in input. + */ +static inline uint8_t +inp_peek(struct ud* u) +{ + uint8_t r = ud_inp_next(u); + if (!u->error) { + inp_back(u); /* Don't backup if there was an error */ + } + return r; +} + + +/* + * inp_len + * Returns the number of bytes input in the current + * session. + */ +static inline size_t +inp_len(const struct ud *u) +{ + return u->inp_ctr; +} + +#endif /* UD_INPUT_H */ +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/itab.c b/Fox/Private/mach_override/libudis86/itab.c new file mode 100755 index 0000000..06d690f --- /dev/null +++ b/Fox/Private/mach_override/libudis86/itab.c @@ -0,0 +1,8401 @@ +/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ +#include "decode.h" + +#define GROUP(n) (0x8000 | (n)) + + +static const uint16_t ud_itab__1[] = { + /* 0 */ 7, 0, +}; + +static const uint16_t ud_itab__2[] = { + /* 0 */ 8, 0, +}; + +static const uint16_t ud_itab__3[] = { + /* 0 */ 15, 0, +}; + +static const uint16_t ud_itab__6[] = { + /* 0 */ 16, 0, 0, 0, +}; + +static const uint16_t ud_itab__7[] = { + /* 0 */ 17, 0, 0, 0, +}; + +static const uint16_t ud_itab__8[] = { + /* 0 */ 18, 0, 0, 0, +}; + +static const uint16_t ud_itab__9[] = { + /* 0 */ 19, 0, 0, 0, +}; + +static const uint16_t ud_itab__10[] = { + /* 0 */ 20, 0, 0, 0, +}; + +static const uint16_t ud_itab__11[] = { + /* 0 */ 21, 0, 0, 0, +}; + +static const uint16_t ud_itab__5[] = { + /* 0 */ GROUP(6), GROUP(7), GROUP(8), GROUP(9), + /* 4 */ GROUP(10), GROUP(11), 0, 0, +}; + +static const uint16_t ud_itab__15[] = { + /* 0 */ 22, 0, +}; + +static const uint16_t ud_itab__14[] = { + /* 0 */ GROUP(15), 0, 0, 0, +}; + +static const uint16_t ud_itab__17[] = { + /* 0 */ 23, 0, +}; + +static const uint16_t ud_itab__16[] = { + /* 0 */ GROUP(17), 0, 0, 0, +}; + +static const uint16_t ud_itab__19[] = { + /* 0 */ 24, 0, +}; + +static const uint16_t ud_itab__18[] = { + /* 0 */ GROUP(19), 0, 0, 0, +}; + +static const uint16_t ud_itab__21[] = { + /* 0 */ 25, 0, +}; + +static const uint16_t ud_itab__20[] = { + /* 0 */ GROUP(21), 0, 0, 0, +}; + +static const uint16_t ud_itab__23[] = { + /* 0 */ 26, 0, +}; + +static const uint16_t ud_itab__22[] = { + /* 0 */ GROUP(23), 0, 0, 0, +}; + +static const uint16_t ud_itab__25[] = { + /* 0 */ 27, 0, +}; + +static const uint16_t ud_itab__24[] = { + /* 0 */ GROUP(25), 0, 0, 0, +}; + +static const uint16_t ud_itab__27[] = { + /* 0 */ 28, 0, +}; + +static const uint16_t ud_itab__26[] = { + /* 0 */ GROUP(27), 0, 0, 0, +}; + +static const uint16_t ud_itab__13[] = { + /* 0 */ GROUP(14), GROUP(16), GROUP(18), GROUP(20), + /* 4 */ GROUP(22), 0, GROUP(24), GROUP(26), +}; + +static const uint16_t ud_itab__32[] = { + /* 0 */ 0, 29, 0, +}; + +static const uint16_t ud_itab__31[] = { + /* 0 */ 0, GROUP(32), +}; + +static const uint16_t ud_itab__30[] = { + /* 0 */ GROUP(31), 0, 0, 0, +}; + +static const uint16_t ud_itab__35[] = { + /* 0 */ 0, 30, 0, +}; + +static const uint16_t ud_itab__34[] = { + /* 0 */ 0, GROUP(35), +}; + +static const uint16_t ud_itab__33[] = { + /* 0 */ GROUP(34), 0, 0, 0, +}; + +static const uint16_t ud_itab__38[] = { + /* 0 */ 0, 31, 0, +}; + +static const uint16_t ud_itab__37[] = { + /* 0 */ 0, GROUP(38), +}; + +static const uint16_t ud_itab__36[] = { + /* 0 */ GROUP(37), 0, 0, 0, +}; + +static const uint16_t ud_itab__41[] = { + /* 0 */ 0, 32, 0, +}; + +static const uint16_t ud_itab__40[] = { + /* 0 */ 0, GROUP(41), +}; + +static const uint16_t ud_itab__39[] = { + /* 0 */ GROUP(40), 0, 0, 0, +}; + +static const uint16_t ud_itab__29[] = { + /* 0 */ 0, GROUP(30), GROUP(33), GROUP(36), + /* 4 */ GROUP(39), 0, 0, 0, +}; + +static const uint16_t ud_itab__44[] = { + /* 0 */ 0, 33, +}; + +static const uint16_t ud_itab__43[] = { + /* 0 */ GROUP(44), 0, 0, 0, +}; + +static const uint16_t ud_itab__46[] = { + /* 0 */ 0, 34, +}; + +static const uint16_t ud_itab__45[] = { + /* 0 */ GROUP(46), 0, 0, 0, +}; + +static const uint16_t ud_itab__42[] = { + /* 0 */ GROUP(43), GROUP(45), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__49[] = { + /* 0 */ 0, 35, +}; + +static const uint16_t ud_itab__48[] = { + /* 0 */ GROUP(49), 0, 0, 0, +}; + +static const uint16_t ud_itab__51[] = { + /* 0 */ 0, 36, +}; + +static const uint16_t ud_itab__50[] = { + /* 0 */ GROUP(51), 0, 0, 0, +}; + +static const uint16_t ud_itab__47[] = { + /* 0 */ GROUP(48), GROUP(50), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__55[] = { + /* 0 */ 37, 0, 0, +}; + +static const uint16_t ud_itab__54[] = { + /* 0 */ 0, GROUP(55), +}; + +static const uint16_t ud_itab__53[] = { + /* 0 */ GROUP(54), 0, 0, 0, +}; + +static const uint16_t ud_itab__58[] = { + /* 0 */ 38, 0, 0, +}; + +static const uint16_t ud_itab__57[] = { + /* 0 */ 0, GROUP(58), +}; + +static const uint16_t ud_itab__56[] = { + /* 0 */ GROUP(57), 0, 0, 0, +}; + +static const uint16_t ud_itab__61[] = { + /* 0 */ 39, 0, 0, +}; + +static const uint16_t ud_itab__60[] = { + /* 0 */ 0, GROUP(61), +}; + +static const uint16_t ud_itab__59[] = { + /* 0 */ GROUP(60), 0, 0, 0, +}; + +static const uint16_t ud_itab__64[] = { + /* 0 */ 40, 0, 0, +}; + +static const uint16_t ud_itab__63[] = { + /* 0 */ 0, GROUP(64), +}; + +static const uint16_t ud_itab__62[] = { + /* 0 */ GROUP(63), 0, 0, 0, +}; + +static const uint16_t ud_itab__67[] = { + /* 0 */ 41, 0, 0, +}; + +static const uint16_t ud_itab__66[] = { + /* 0 */ 0, GROUP(67), +}; + +static const uint16_t ud_itab__65[] = { + /* 0 */ GROUP(66), 0, 0, 0, +}; + +static const uint16_t ud_itab__70[] = { + /* 0 */ 42, 0, 0, +}; + +static const uint16_t ud_itab__69[] = { + /* 0 */ 0, GROUP(70), +}; + +static const uint16_t ud_itab__68[] = { + /* 0 */ GROUP(69), 0, 0, 0, +}; + +static const uint16_t ud_itab__73[] = { + /* 0 */ 43, 0, 0, +}; + +static const uint16_t ud_itab__72[] = { + /* 0 */ 0, GROUP(73), +}; + +static const uint16_t ud_itab__71[] = { + /* 0 */ GROUP(72), 0, 0, 0, +}; + +static const uint16_t ud_itab__76[] = { + /* 0 */ 44, 0, 0, +}; + +static const uint16_t ud_itab__75[] = { + /* 0 */ 0, GROUP(76), +}; + +static const uint16_t ud_itab__74[] = { + /* 0 */ GROUP(75), 0, 0, 0, +}; + +static const uint16_t ud_itab__52[] = { + /* 0 */ GROUP(53), GROUP(56), GROUP(59), GROUP(62), + /* 4 */ GROUP(65), GROUP(68), GROUP(71), GROUP(74), +}; + +static const uint16_t ud_itab__78[] = { + /* 0 */ 0, 45, +}; + +static const uint16_t ud_itab__77[] = { + /* 0 */ GROUP(78), 0, 0, 0, +}; + +static const uint16_t ud_itab__80[] = { + /* 0 */ 0, 46, +}; + +static const uint16_t ud_itab__79[] = { + /* 0 */ GROUP(80), 0, 0, 0, +}; + +static const uint16_t ud_itab__83[] = { + /* 0 */ 0, 47, +}; + +static const uint16_t ud_itab__82[] = { + /* 0 */ GROUP(83), 0, 0, 0, +}; + +static const uint16_t ud_itab__86[] = { + /* 0 */ 48, 0, 0, +}; + +static const uint16_t ud_itab__85[] = { + /* 0 */ 0, GROUP(86), +}; + +static const uint16_t ud_itab__84[] = { + /* 0 */ GROUP(85), 0, 0, 0, +}; + +static const uint16_t ud_itab__81[] = { + /* 0 */ GROUP(82), GROUP(84), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__28[] = { + /* 0 */ GROUP(29), GROUP(42), GROUP(47), GROUP(52), + /* 4 */ GROUP(77), 0, GROUP(79), GROUP(81), +}; + +static const uint16_t ud_itab__12[] = { + /* 0 */ GROUP(13), GROUP(28), +}; + +static const uint16_t ud_itab__87[] = { + /* 0 */ 49, 0, 0, 0, +}; + +static const uint16_t ud_itab__88[] = { + /* 0 */ 50, 0, 0, 0, +}; + +static const uint16_t ud_itab__89[] = { + /* 0 */ 51, 0, 0, 0, +}; + +static const uint16_t ud_itab__90[] = { + /* 0 */ 52, 0, 0, 0, +}; + +static const uint16_t ud_itab__91[] = { + /* 0 */ 53, 0, 0, 0, +}; + +static const uint16_t ud_itab__92[] = { + /* 0 */ 54, 0, 0, 0, +}; + +static const uint16_t ud_itab__93[] = { + /* 0 */ 55, 0, 0, 0, +}; + +static const uint16_t ud_itab__94[] = { + /* 0 */ 56, 0, 0, 0, +}; + +static const uint16_t ud_itab__96[] = { + /* 0 */ 57, 0, 0, 0, +}; + +static const uint16_t ud_itab__97[] = { + /* 0 */ 58, 0, 0, 0, +}; + +static const uint16_t ud_itab__98[] = { + /* 0 */ 59, 0, 0, 0, +}; + +static const uint16_t ud_itab__99[] = { + /* 0 */ 60, 0, 0, 0, +}; + +static const uint16_t ud_itab__100[] = { + /* 0 */ 61, 0, 0, 0, +}; + +static const uint16_t ud_itab__101[] = { + /* 0 */ 62, 0, 0, 0, +}; + +static const uint16_t ud_itab__102[] = { + /* 0 */ 63, 0, 0, 0, +}; + +static const uint16_t ud_itab__103[] = { + /* 0 */ 64, 0, 0, 0, +}; + +static const uint16_t ud_itab__95[] = { + /* 0 */ GROUP(96), GROUP(97), GROUP(98), GROUP(99), + /* 4 */ GROUP(100), GROUP(101), GROUP(102), GROUP(103), +}; + +static const uint16_t ud_itab__104[] = { + /* 0 */ 65, 0, 0, 0, +}; + +static const uint16_t ud_itab__105[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ 0, 0, 0, 0, + /* c */ 66, 67, 0, 0, + /* 10 */ 0, 0, 0, 0, + /* 14 */ 0, 0, 0, 0, + /* 18 */ 0, 0, 0, 0, + /* 1c */ 68, 69, 0, 0, + /* 20 */ 0, 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ 0, 0, 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 70, 0, + /* 8c */ 0, 0, 71, 0, + /* 90 */ 72, 0, 0, 0, + /* 94 */ 73, 0, 74, 75, + /* 98 */ 0, 0, 76, 0, + /* 9c */ 0, 0, 77, 0, + /* a0 */ 78, 0, 0, 0, + /* a4 */ 79, 0, 80, 81, + /* a8 */ 0, 0, 82, 0, + /* ac */ 0, 0, 83, 0, + /* b0 */ 84, 0, 0, 0, + /* b4 */ 85, 0, 86, 87, + /* b8 */ 0, 0, 0, 88, + /* bc */ 0, 0, 0, 89, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, 0, + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__106[] = { + /* 0 */ 90, 91, 92, 93, +}; + +static const uint16_t ud_itab__107[] = { + /* 0 */ 94, 95, 96, 97, +}; + +static const uint16_t ud_itab__110[] = { + /* 0 */ 98, 0, +}; + +static const uint16_t ud_itab__111[] = { + /* 0 */ 99, 0, +}; + +static const uint16_t ud_itab__112[] = { + /* 0 */ 100, 0, +}; + +static const uint16_t ud_itab__113[] = { + /* 0 */ 101, 0, +}; + +static const uint16_t ud_itab__109[] = { + /* 0 */ GROUP(110), GROUP(111), GROUP(112), GROUP(113), +}; + +static const uint16_t ud_itab__115[] = { + /* 0 */ 0, 102, +}; + +static const uint16_t ud_itab__116[] = { + /* 0 */ 0, 103, +}; + +static const uint16_t ud_itab__117[] = { + /* 0 */ 0, 104, +}; + +static const uint16_t ud_itab__114[] = { + /* 0 */ GROUP(115), GROUP(116), GROUP(117), 0, +}; + +static const uint16_t ud_itab__108[] = { + /* 0 */ GROUP(109), GROUP(114), +}; + +static const uint16_t ud_itab__118[] = { + /* 0 */ 105, 0, 0, 106, +}; + +static const uint16_t ud_itab__119[] = { + /* 0 */ 107, 0, 0, 108, +}; + +static const uint16_t ud_itab__120[] = { + /* 0 */ 109, 0, 0, 110, +}; + +static const uint16_t ud_itab__123[] = { + /* 0 */ 111, 0, +}; + +static const uint16_t ud_itab__124[] = { + /* 0 */ 112, 0, +}; + +static const uint16_t ud_itab__125[] = { + /* 0 */ 113, 0, +}; + +static const uint16_t ud_itab__122[] = { + /* 0 */ GROUP(123), 0, GROUP(124), GROUP(125), +}; + +static const uint16_t ud_itab__127[] = { + /* 0 */ 0, 114, +}; + +static const uint16_t ud_itab__128[] = { + /* 0 */ 0, 115, +}; + +static const uint16_t ud_itab__126[] = { + /* 0 */ GROUP(127), 0, GROUP(128), 0, +}; + +static const uint16_t ud_itab__121[] = { + /* 0 */ GROUP(122), GROUP(126), +}; + +static const uint16_t ud_itab__129[] = { + /* 0 */ 116, 0, 0, 117, +}; + +static const uint16_t ud_itab__131[] = { + /* 0 */ 118, 0, 0, 0, +}; + +static const uint16_t ud_itab__132[] = { + /* 0 */ 119, 0, 0, 0, +}; + +static const uint16_t ud_itab__133[] = { + /* 0 */ 120, 0, 0, 0, +}; + +static const uint16_t ud_itab__134[] = { + /* 0 */ 121, 0, 0, 0, +}; + +static const uint16_t ud_itab__130[] = { + /* 0 */ GROUP(131), GROUP(132), GROUP(133), GROUP(134), + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__135[] = { + /* 0 */ 122, 0, 0, 0, +}; + +static const uint16_t ud_itab__136[] = { + /* 0 */ 123, 0, 0, 0, +}; + +static const uint16_t ud_itab__137[] = { + /* 0 */ 124, 0, 0, 0, +}; + +static const uint16_t ud_itab__138[] = { + /* 0 */ 125, 0, 0, 0, +}; + +static const uint16_t ud_itab__139[] = { + /* 0 */ 126, 0, 0, 0, +}; + +static const uint16_t ud_itab__140[] = { + /* 0 */ 127, 0, 0, 0, +}; + +static const uint16_t ud_itab__141[] = { + /* 0 */ 128, 0, 0, 0, +}; + +static const uint16_t ud_itab__142[] = { + /* 0 */ 129, 0, 0, 0, +}; + +static const uint16_t ud_itab__143[] = { + /* 0 */ 130, 0, 0, 0, +}; + +static const uint16_t ud_itab__144[] = { + /* 0 */ 131, 0, 0, 0, +}; + +static const uint16_t ud_itab__145[] = { + /* 0 */ 132, 0, 0, 0, +}; + +static const uint16_t ud_itab__146[] = { + /* 0 */ 133, 0, 0, 134, +}; + +static const uint16_t ud_itab__147[] = { + /* 0 */ 135, 0, 0, 136, +}; + +static const uint16_t ud_itab__148[] = { + /* 0 */ 137, 138, 139, 140, +}; + +static const uint16_t ud_itab__149[] = { + /* 0 */ 141, 0, 0, 142, +}; + +static const uint16_t ud_itab__150[] = { + /* 0 */ 143, 144, 145, 146, +}; + +static const uint16_t ud_itab__151[] = { + /* 0 */ 147, 148, 149, 150, +}; + +static const uint16_t ud_itab__152[] = { + /* 0 */ 151, 0, 0, 152, +}; + +static const uint16_t ud_itab__153[] = { + /* 0 */ 153, 0, 0, 154, +}; + +static const uint16_t ud_itab__154[] = { + /* 0 */ 155, 0, 0, 0, +}; + +static const uint16_t ud_itab__155[] = { + /* 0 */ 156, 0, 0, 0, +}; + +static const uint16_t ud_itab__156[] = { + /* 0 */ 157, 0, 0, 0, +}; + +static const uint16_t ud_itab__157[] = { + /* 0 */ 158, 0, 0, 0, +}; + +static const uint16_t ud_itab__160[] = { + /* 0 */ 0, 160, 0, +}; + +static const uint16_t ud_itab__159[] = { + /* 0 */ 159, GROUP(160), +}; + +static const uint16_t ud_itab__158[] = { + /* 0 */ GROUP(159), 0, 0, 0, +}; + +static const uint16_t ud_itab__163[] = { + /* 0 */ 0, 162, 0, +}; + +static const uint16_t ud_itab__162[] = { + /* 0 */ 161, GROUP(163), +}; + +static const uint16_t ud_itab__161[] = { + /* 0 */ GROUP(162), 0, 0, 0, +}; + +static const uint16_t ud_itab__164[] = { + /* 0 */ 163, 0, 0, 0, +}; + +static const uint16_t ud_itab__166[] = { + /* 0 */ 164, 0, 0, 165, +}; + +static const uint16_t ud_itab__167[] = { + /* 0 */ 166, 0, 0, 167, +}; + +static const uint16_t ud_itab__168[] = { + /* 0 */ 168, 0, 0, 169, +}; + +static const uint16_t ud_itab__169[] = { + /* 0 */ 170, 0, 0, 171, +}; + +static const uint16_t ud_itab__170[] = { + /* 0 */ 172, 0, 0, 173, +}; + +static const uint16_t ud_itab__171[] = { + /* 0 */ 174, 0, 0, 175, +}; + +static const uint16_t ud_itab__172[] = { + /* 0 */ 176, 0, 0, 177, +}; + +static const uint16_t ud_itab__173[] = { + /* 0 */ 178, 0, 0, 179, +}; + +static const uint16_t ud_itab__174[] = { + /* 0 */ 180, 0, 0, 181, +}; + +static const uint16_t ud_itab__175[] = { + /* 0 */ 182, 0, 0, 183, +}; + +static const uint16_t ud_itab__176[] = { + /* 0 */ 184, 0, 0, 185, +}; + +static const uint16_t ud_itab__177[] = { + /* 0 */ 186, 0, 0, 187, +}; + +static const uint16_t ud_itab__178[] = { + /* 0 */ 0, 0, 0, 188, +}; + +static const uint16_t ud_itab__179[] = { + /* 0 */ 0, 0, 0, 189, +}; + +static const uint16_t ud_itab__180[] = { + /* 0 */ 0, 0, 0, 190, +}; + +static const uint16_t ud_itab__181[] = { + /* 0 */ 0, 0, 0, 191, +}; + +static const uint16_t ud_itab__182[] = { + /* 0 */ 192, 0, 0, 193, +}; + +static const uint16_t ud_itab__183[] = { + /* 0 */ 194, 0, 0, 195, +}; + +static const uint16_t ud_itab__184[] = { + /* 0 */ 196, 0, 0, 197, +}; + +static const uint16_t ud_itab__185[] = { + /* 0 */ 0, 0, 0, 198, +}; + +static const uint16_t ud_itab__186[] = { + /* 0 */ 0, 0, 0, 199, +}; + +static const uint16_t ud_itab__187[] = { + /* 0 */ 0, 0, 0, 200, +}; + +static const uint16_t ud_itab__188[] = { + /* 0 */ 0, 0, 0, 201, +}; + +static const uint16_t ud_itab__189[] = { + /* 0 */ 0, 0, 0, 202, +}; + +static const uint16_t ud_itab__190[] = { + /* 0 */ 0, 0, 0, 203, +}; + +static const uint16_t ud_itab__191[] = { + /* 0 */ 0, 0, 0, 204, +}; + +static const uint16_t ud_itab__192[] = { + /* 0 */ 0, 0, 0, 205, +}; + +static const uint16_t ud_itab__193[] = { + /* 0 */ 0, 0, 0, 206, +}; + +static const uint16_t ud_itab__194[] = { + /* 0 */ 0, 0, 0, 207, +}; + +static const uint16_t ud_itab__195[] = { + /* 0 */ 0, 0, 0, 208, +}; + +static const uint16_t ud_itab__196[] = { + /* 0 */ 0, 0, 0, 209, +}; + +static const uint16_t ud_itab__197[] = { + /* 0 */ 0, 0, 0, 210, +}; + +static const uint16_t ud_itab__198[] = { + /* 0 */ 0, 0, 0, 211, +}; + +static const uint16_t ud_itab__199[] = { + /* 0 */ 0, 0, 0, 212, +}; + +static const uint16_t ud_itab__200[] = { + /* 0 */ 0, 0, 0, 213, +}; + +static const uint16_t ud_itab__201[] = { + /* 0 */ 0, 0, 0, 214, +}; + +static const uint16_t ud_itab__202[] = { + /* 0 */ 0, 0, 0, 215, +}; + +static const uint16_t ud_itab__203[] = { + /* 0 */ 0, 0, 0, 216, +}; + +static const uint16_t ud_itab__204[] = { + /* 0 */ 0, 0, 0, 217, +}; + +static const uint16_t ud_itab__205[] = { + /* 0 */ 0, 0, 0, 218, +}; + +static const uint16_t ud_itab__206[] = { + /* 0 */ 0, 0, 0, 219, +}; + +static const uint16_t ud_itab__207[] = { + /* 0 */ 0, 0, 0, 220, +}; + +static const uint16_t ud_itab__208[] = { + /* 0 */ 0, 0, 0, 221, +}; + +static const uint16_t ud_itab__209[] = { + /* 0 */ 0, 0, 0, 222, +}; + +static const uint16_t ud_itab__210[] = { + /* 0 */ 0, 0, 0, 223, +}; + +static const uint16_t ud_itab__211[] = { + /* 0 */ 0, 0, 0, 224, +}; + +static const uint16_t ud_itab__214[] = { + /* 0 */ 0, 225, 0, +}; + +static const uint16_t ud_itab__213[] = { + /* 0 */ 0, GROUP(214), +}; + +static const uint16_t ud_itab__212[] = { + /* 0 */ 0, 0, 0, GROUP(213), +}; + +static const uint16_t ud_itab__217[] = { + /* 0 */ 0, 226, 0, +}; + +static const uint16_t ud_itab__216[] = { + /* 0 */ 0, GROUP(217), +}; + +static const uint16_t ud_itab__215[] = { + /* 0 */ 0, 0, 0, GROUP(216), +}; + +static const uint16_t ud_itab__218[] = { + /* 0 */ 0, 0, 0, 227, +}; + +static const uint16_t ud_itab__219[] = { + /* 0 */ 0, 0, 0, 228, +}; + +static const uint16_t ud_itab__220[] = { + /* 0 */ 0, 0, 0, 229, +}; + +static const uint16_t ud_itab__221[] = { + /* 0 */ 0, 0, 0, 230, +}; + +static const uint16_t ud_itab__222[] = { + /* 0 */ 0, 0, 0, 231, +}; + +static const uint16_t ud_itab__223[] = { + /* 0 */ 232, 233, 0, 0, +}; + +static const uint16_t ud_itab__224[] = { + /* 0 */ 234, 235, 0, 0, +}; + +static const uint16_t ud_itab__165[] = { + /* 0 */ GROUP(166), GROUP(167), GROUP(168), GROUP(169), + /* 4 */ GROUP(170), GROUP(171), GROUP(172), GROUP(173), + /* 8 */ GROUP(174), GROUP(175), GROUP(176), GROUP(177), + /* c */ 0, 0, 0, 0, + /* 10 */ GROUP(178), 0, 0, 0, + /* 14 */ GROUP(179), GROUP(180), 0, GROUP(181), + /* 18 */ 0, 0, 0, 0, + /* 1c */ GROUP(182), GROUP(183), GROUP(184), 0, + /* 20 */ GROUP(185), GROUP(186), GROUP(187), GROUP(188), + /* 24 */ GROUP(189), GROUP(190), 0, 0, + /* 28 */ GROUP(191), GROUP(192), GROUP(193), GROUP(194), + /* 2c */ 0, 0, 0, 0, + /* 30 */ GROUP(195), GROUP(196), GROUP(197), GROUP(198), + /* 34 */ GROUP(199), GROUP(200), 0, GROUP(201), + /* 38 */ GROUP(202), GROUP(203), GROUP(204), GROUP(205), + /* 3c */ GROUP(206), GROUP(207), GROUP(208), GROUP(209), + /* 40 */ GROUP(210), GROUP(211), 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ GROUP(212), GROUP(215), 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, GROUP(218), + /* dc */ GROUP(219), GROUP(220), GROUP(221), GROUP(222), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ GROUP(223), GROUP(224), 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__226[] = { + /* 0 */ 0, 0, 0, 236, +}; + +static const uint16_t ud_itab__227[] = { + /* 0 */ 0, 0, 0, 237, +}; + +static const uint16_t ud_itab__228[] = { + /* 0 */ 0, 0, 0, 238, +}; + +static const uint16_t ud_itab__229[] = { + /* 0 */ 0, 0, 0, 239, +}; + +static const uint16_t ud_itab__230[] = { + /* 0 */ 0, 0, 0, 240, +}; + +static const uint16_t ud_itab__231[] = { + /* 0 */ 0, 0, 0, 241, +}; + +static const uint16_t ud_itab__232[] = { + /* 0 */ 0, 0, 0, 242, +}; + +static const uint16_t ud_itab__233[] = { + /* 0 */ 243, 0, 0, 244, +}; + +static const uint16_t ud_itab__234[] = { + /* 0 */ 0, 0, 0, 245, +}; + +static const uint16_t ud_itab__235[] = { + /* 0 */ 0, 0, 0, 246, +}; + +static const uint16_t ud_itab__237[] = { + /* 0 */ 247, 248, 249, +}; + +static const uint16_t ud_itab__236[] = { + /* 0 */ 0, 0, 0, GROUP(237), +}; + +static const uint16_t ud_itab__238[] = { + /* 0 */ 0, 0, 0, 250, +}; + +static const uint16_t ud_itab__239[] = { + /* 0 */ 0, 0, 0, 251, +}; + +static const uint16_t ud_itab__240[] = { + /* 0 */ 0, 0, 0, 252, +}; + +static const uint16_t ud_itab__242[] = { + /* 0 */ 253, 254, 255, +}; + +static const uint16_t ud_itab__241[] = { + /* 0 */ 0, 0, 0, GROUP(242), +}; + +static const uint16_t ud_itab__243[] = { + /* 0 */ 0, 0, 0, 256, +}; + +static const uint16_t ud_itab__244[] = { + /* 0 */ 0, 0, 0, 257, +}; + +static const uint16_t ud_itab__245[] = { + /* 0 */ 0, 0, 0, 258, +}; + +static const uint16_t ud_itab__246[] = { + /* 0 */ 0, 0, 0, 259, +}; + +static const uint16_t ud_itab__247[] = { + /* 0 */ 0, 0, 0, 260, +}; + +static const uint16_t ud_itab__248[] = { + /* 0 */ 0, 0, 0, 261, +}; + +static const uint16_t ud_itab__249[] = { + /* 0 */ 0, 0, 0, 262, +}; + +static const uint16_t ud_itab__250[] = { + /* 0 */ 0, 0, 0, 263, +}; + +static const uint16_t ud_itab__251[] = { + /* 0 */ 0, 0, 0, 264, +}; + +static const uint16_t ud_itab__225[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ GROUP(226), GROUP(227), GROUP(228), GROUP(229), + /* c */ GROUP(230), GROUP(231), GROUP(232), GROUP(233), + /* 10 */ 0, 0, 0, 0, + /* 14 */ GROUP(234), GROUP(235), GROUP(236), GROUP(238), + /* 18 */ 0, 0, 0, 0, + /* 1c */ 0, 0, 0, 0, + /* 20 */ GROUP(239), GROUP(240), GROUP(241), 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ GROUP(243), GROUP(244), GROUP(245), 0, + /* 44 */ GROUP(246), 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ GROUP(247), GROUP(248), GROUP(249), GROUP(250), + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, GROUP(251), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__252[] = { + /* 0 */ 265, 0, 0, 0, +}; + +static const uint16_t ud_itab__253[] = { + /* 0 */ 266, 0, 0, 0, +}; + +static const uint16_t ud_itab__254[] = { + /* 0 */ 267, 0, 0, 0, +}; + +static const uint16_t ud_itab__255[] = { + /* 0 */ 268, 0, 0, 0, +}; + +static const uint16_t ud_itab__256[] = { + /* 0 */ 269, 0, 0, 0, +}; + +static const uint16_t ud_itab__257[] = { + /* 0 */ 270, 0, 0, 0, +}; + +static const uint16_t ud_itab__258[] = { + /* 0 */ 271, 0, 0, 0, +}; + +static const uint16_t ud_itab__259[] = { + /* 0 */ 272, 0, 0, 0, +}; + +static const uint16_t ud_itab__260[] = { + /* 0 */ 273, 0, 0, 0, +}; + +static const uint16_t ud_itab__261[] = { + /* 0 */ 274, 0, 0, 0, +}; + +static const uint16_t ud_itab__262[] = { + /* 0 */ 275, 0, 0, 0, +}; + +static const uint16_t ud_itab__263[] = { + /* 0 */ 276, 0, 0, 0, +}; + +static const uint16_t ud_itab__264[] = { + /* 0 */ 277, 0, 0, 0, +}; + +static const uint16_t ud_itab__265[] = { + /* 0 */ 278, 0, 0, 0, +}; + +static const uint16_t ud_itab__266[] = { + /* 0 */ 279, 0, 0, 0, +}; + +static const uint16_t ud_itab__267[] = { + /* 0 */ 280, 0, 0, 0, +}; + +static const uint16_t ud_itab__268[] = { + /* 0 */ 281, 0, 0, 282, +}; + +static const uint16_t ud_itab__269[] = { + /* 0 */ 283, 284, 285, 286, +}; + +static const uint16_t ud_itab__270[] = { + /* 0 */ 287, 0, 288, 0, +}; + +static const uint16_t ud_itab__271[] = { + /* 0 */ 289, 0, 290, 0, +}; + +static const uint16_t ud_itab__272[] = { + /* 0 */ 291, 0, 0, 292, +}; + +static const uint16_t ud_itab__273[] = { + /* 0 */ 293, 0, 0, 294, +}; + +static const uint16_t ud_itab__274[] = { + /* 0 */ 295, 0, 0, 296, +}; + +static const uint16_t ud_itab__275[] = { + /* 0 */ 297, 0, 0, 298, +}; + +static const uint16_t ud_itab__276[] = { + /* 0 */ 299, 300, 301, 302, +}; + +static const uint16_t ud_itab__277[] = { + /* 0 */ 303, 304, 305, 306, +}; + +static const uint16_t ud_itab__278[] = { + /* 0 */ 307, 308, 309, 310, +}; + +static const uint16_t ud_itab__279[] = { + /* 0 */ 311, 0, 312, 313, +}; + +static const uint16_t ud_itab__280[] = { + /* 0 */ 314, 315, 316, 317, +}; + +static const uint16_t ud_itab__281[] = { + /* 0 */ 318, 319, 320, 321, +}; + +static const uint16_t ud_itab__282[] = { + /* 0 */ 322, 323, 324, 325, +}; + +static const uint16_t ud_itab__283[] = { + /* 0 */ 326, 327, 328, 329, +}; + +static const uint16_t ud_itab__284[] = { + /* 0 */ 330, 0, 0, 331, +}; + +static const uint16_t ud_itab__285[] = { + /* 0 */ 332, 0, 0, 333, +}; + +static const uint16_t ud_itab__286[] = { + /* 0 */ 334, 0, 0, 335, +}; + +static const uint16_t ud_itab__287[] = { + /* 0 */ 336, 0, 0, 337, +}; + +static const uint16_t ud_itab__288[] = { + /* 0 */ 338, 0, 0, 339, +}; + +static const uint16_t ud_itab__289[] = { + /* 0 */ 340, 0, 0, 341, +}; + +static const uint16_t ud_itab__290[] = { + /* 0 */ 342, 0, 0, 343, +}; + +static const uint16_t ud_itab__291[] = { + /* 0 */ 344, 0, 0, 345, +}; + +static const uint16_t ud_itab__292[] = { + /* 0 */ 346, 0, 0, 347, +}; + +static const uint16_t ud_itab__293[] = { + /* 0 */ 348, 0, 0, 349, +}; + +static const uint16_t ud_itab__294[] = { + /* 0 */ 350, 0, 0, 351, +}; + +static const uint16_t ud_itab__295[] = { + /* 0 */ 352, 0, 0, 353, +}; + +static const uint16_t ud_itab__296[] = { + /* 0 */ 0, 0, 0, 354, +}; + +static const uint16_t ud_itab__297[] = { + /* 0 */ 0, 0, 0, 355, +}; + +static const uint16_t ud_itab__298[] = { + /* 0 */ 356, 0, 0, 357, +}; + +static const uint16_t ud_itab__299[] = { + /* 0 */ 358, 0, 359, 360, +}; + +static const uint16_t ud_itab__300[] = { + /* 0 */ 361, 362, 363, 364, +}; + +static const uint16_t ud_itab__302[] = { + /* 0 */ 365, 0, 0, 366, +}; + +static const uint16_t ud_itab__303[] = { + /* 0 */ 367, 0, 0, 368, +}; + +static const uint16_t ud_itab__304[] = { + /* 0 */ 369, 0, 0, 370, +}; + +static const uint16_t ud_itab__301[] = { + /* 0 */ 0, 0, GROUP(302), 0, + /* 4 */ GROUP(303), 0, GROUP(304), 0, +}; + +static const uint16_t ud_itab__306[] = { + /* 0 */ 371, 0, 0, 372, +}; + +static const uint16_t ud_itab__307[] = { + /* 0 */ 373, 0, 0, 374, +}; + +static const uint16_t ud_itab__308[] = { + /* 0 */ 375, 0, 0, 376, +}; + +static const uint16_t ud_itab__305[] = { + /* 0 */ 0, 0, GROUP(306), 0, + /* 4 */ GROUP(307), 0, GROUP(308), 0, +}; + +static const uint16_t ud_itab__310[] = { + /* 0 */ 377, 0, 0, 378, +}; + +static const uint16_t ud_itab__311[] = { + /* 0 */ 0, 0, 0, 379, +}; + +static const uint16_t ud_itab__312[] = { + /* 0 */ 380, 0, 0, 381, +}; + +static const uint16_t ud_itab__313[] = { + /* 0 */ 0, 0, 0, 382, +}; + +static const uint16_t ud_itab__309[] = { + /* 0 */ 0, 0, GROUP(310), GROUP(311), + /* 4 */ 0, 0, GROUP(312), GROUP(313), +}; + +static const uint16_t ud_itab__314[] = { + /* 0 */ 383, 0, 0, 384, +}; + +static const uint16_t ud_itab__315[] = { + /* 0 */ 385, 0, 0, 386, +}; + +static const uint16_t ud_itab__316[] = { + /* 0 */ 387, 0, 0, 388, +}; + +static const uint16_t ud_itab__317[] = { + /* 0 */ 389, 0, 0, 0, +}; + +static const uint16_t ud_itab__319[] = { + /* 0 */ 0, 390, 0, +}; + +static const uint16_t ud_itab__318[] = { + /* 0 */ GROUP(319), 0, 0, 0, +}; + +static const uint16_t ud_itab__321[] = { + /* 0 */ 0, 391, 0, +}; + +static const uint16_t ud_itab__320[] = { + /* 0 */ GROUP(321), 0, 0, 0, +}; + +static const uint16_t ud_itab__322[] = { + /* 0 */ 0, 392, 0, 393, +}; + +static const uint16_t ud_itab__323[] = { + /* 0 */ 0, 394, 0, 395, +}; + +static const uint16_t ud_itab__324[] = { + /* 0 */ 396, 0, 397, 398, +}; + +static const uint16_t ud_itab__325[] = { + /* 0 */ 399, 0, 400, 401, +}; + +static const uint16_t ud_itab__326[] = { + /* 0 */ 402, 0, 0, 0, +}; + +static const uint16_t ud_itab__327[] = { + /* 0 */ 403, 0, 0, 0, +}; + +static const uint16_t ud_itab__328[] = { + /* 0 */ 404, 0, 0, 0, +}; + +static const uint16_t ud_itab__329[] = { + /* 0 */ 405, 0, 0, 0, +}; + +static const uint16_t ud_itab__330[] = { + /* 0 */ 406, 0, 0, 0, +}; + +static const uint16_t ud_itab__331[] = { + /* 0 */ 407, 0, 0, 0, +}; + +static const uint16_t ud_itab__332[] = { + /* 0 */ 408, 0, 0, 0, +}; + +static const uint16_t ud_itab__333[] = { + /* 0 */ 409, 0, 0, 0, +}; + +static const uint16_t ud_itab__334[] = { + /* 0 */ 410, 0, 0, 0, +}; + +static const uint16_t ud_itab__335[] = { + /* 0 */ 411, 0, 0, 0, +}; + +static const uint16_t ud_itab__336[] = { + /* 0 */ 412, 0, 0, 0, +}; + +static const uint16_t ud_itab__337[] = { + /* 0 */ 413, 0, 0, 0, +}; + +static const uint16_t ud_itab__338[] = { + /* 0 */ 414, 0, 0, 0, +}; + +static const uint16_t ud_itab__339[] = { + /* 0 */ 415, 0, 0, 0, +}; + +static const uint16_t ud_itab__340[] = { + /* 0 */ 416, 0, 0, 0, +}; + +static const uint16_t ud_itab__341[] = { + /* 0 */ 417, 0, 0, 0, +}; + +static const uint16_t ud_itab__342[] = { + /* 0 */ 418, 0, 0, 0, +}; + +static const uint16_t ud_itab__343[] = { + /* 0 */ 419, 0, 0, 0, +}; + +static const uint16_t ud_itab__344[] = { + /* 0 */ 420, 0, 0, 0, +}; + +static const uint16_t ud_itab__345[] = { + /* 0 */ 421, 0, 0, 0, +}; + +static const uint16_t ud_itab__346[] = { + /* 0 */ 422, 0, 0, 0, +}; + +static const uint16_t ud_itab__347[] = { + /* 0 */ 423, 0, 0, 0, +}; + +static const uint16_t ud_itab__348[] = { + /* 0 */ 424, 0, 0, 0, +}; + +static const uint16_t ud_itab__349[] = { + /* 0 */ 425, 0, 0, 0, +}; + +static const uint16_t ud_itab__350[] = { + /* 0 */ 426, 0, 0, 0, +}; + +static const uint16_t ud_itab__351[] = { + /* 0 */ 427, 0, 0, 0, +}; + +static const uint16_t ud_itab__352[] = { + /* 0 */ 428, 0, 0, 0, +}; + +static const uint16_t ud_itab__353[] = { + /* 0 */ 429, 0, 0, 0, +}; + +static const uint16_t ud_itab__354[] = { + /* 0 */ 430, 0, 0, 0, +}; + +static const uint16_t ud_itab__355[] = { + /* 0 */ 431, 0, 0, 0, +}; + +static const uint16_t ud_itab__356[] = { + /* 0 */ 432, 0, 0, 0, +}; + +static const uint16_t ud_itab__357[] = { + /* 0 */ 433, 0, 0, 0, +}; + +static const uint16_t ud_itab__358[] = { + /* 0 */ 434, 0, 0, 0, +}; + +static const uint16_t ud_itab__359[] = { + /* 0 */ 435, 0, 0, 0, +}; + +static const uint16_t ud_itab__360[] = { + /* 0 */ 436, 0, 0, 0, +}; + +static const uint16_t ud_itab__361[] = { + /* 0 */ 437, 0, 0, 0, +}; + +static const uint16_t ud_itab__362[] = { + /* 0 */ 438, 0, 0, 0, +}; + +static const uint16_t ud_itab__363[] = { + /* 0 */ 439, 0, 0, 0, +}; + +static const uint16_t ud_itab__368[] = { + /* 0 */ 0, 440, +}; + +static const uint16_t ud_itab__367[] = { + /* 0 */ GROUP(368), 0, 0, 0, +}; + +static const uint16_t ud_itab__366[] = { + /* 0 */ GROUP(367), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__371[] = { + /* 0 */ 0, 441, +}; + +static const uint16_t ud_itab__370[] = { + /* 0 */ GROUP(371), 0, 0, 0, +}; + +static const uint16_t ud_itab__369[] = { + /* 0 */ GROUP(370), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__374[] = { + /* 0 */ 0, 442, +}; + +static const uint16_t ud_itab__373[] = { + /* 0 */ GROUP(374), 0, 0, 0, +}; + +static const uint16_t ud_itab__372[] = { + /* 0 */ GROUP(373), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__365[] = { + /* 0 */ GROUP(366), GROUP(369), GROUP(372), 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__364[] = { + /* 0 */ 0, GROUP(365), +}; + +static const uint16_t ud_itab__379[] = { + /* 0 */ 0, 443, +}; + +static const uint16_t ud_itab__378[] = { + /* 0 */ GROUP(379), 0, 0, 0, +}; + +static const uint16_t ud_itab__377[] = { + /* 0 */ GROUP(378), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__382[] = { + /* 0 */ 0, 444, +}; + +static const uint16_t ud_itab__381[] = { + /* 0 */ GROUP(382), 0, 0, 0, +}; + +static const uint16_t ud_itab__380[] = { + /* 0 */ GROUP(381), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__385[] = { + /* 0 */ 0, 445, +}; + +static const uint16_t ud_itab__384[] = { + /* 0 */ GROUP(385), 0, 0, 0, +}; + +static const uint16_t ud_itab__383[] = { + /* 0 */ GROUP(384), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__388[] = { + /* 0 */ 0, 446, +}; + +static const uint16_t ud_itab__387[] = { + /* 0 */ GROUP(388), 0, 0, 0, +}; + +static const uint16_t ud_itab__386[] = { + /* 0 */ GROUP(387), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__391[] = { + /* 0 */ 0, 447, +}; + +static const uint16_t ud_itab__390[] = { + /* 0 */ GROUP(391), 0, 0, 0, +}; + +static const uint16_t ud_itab__389[] = { + /* 0 */ GROUP(390), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__394[] = { + /* 0 */ 0, 448, +}; + +static const uint16_t ud_itab__393[] = { + /* 0 */ GROUP(394), 0, 0, 0, +}; + +static const uint16_t ud_itab__392[] = { + /* 0 */ GROUP(393), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__376[] = { + /* 0 */ GROUP(377), GROUP(380), GROUP(383), GROUP(386), + /* 4 */ GROUP(389), GROUP(392), 0, 0, +}; + +static const uint16_t ud_itab__375[] = { + /* 0 */ 0, GROUP(376), +}; + +static const uint16_t ud_itab__395[] = { + /* 0 */ 449, 0, 0, 0, +}; + +static const uint16_t ud_itab__396[] = { + /* 0 */ 450, 0, 0, 0, +}; + +static const uint16_t ud_itab__397[] = { + /* 0 */ 451, 0, 0, 0, +}; + +static const uint16_t ud_itab__398[] = { + /* 0 */ 452, 0, 0, 0, +}; + +static const uint16_t ud_itab__399[] = { + /* 0 */ 453, 0, 0, 0, +}; + +static const uint16_t ud_itab__400[] = { + /* 0 */ 454, 0, 0, 0, +}; + +static const uint16_t ud_itab__404[] = { + /* 0 */ 455, 0, +}; + +static const uint16_t ud_itab__403[] = { + /* 0 */ GROUP(404), 0, 0, 0, +}; + +static const uint16_t ud_itab__406[] = { + /* 0 */ 456, 0, +}; + +static const uint16_t ud_itab__405[] = { + /* 0 */ GROUP(406), 0, 0, 0, +}; + +static const uint16_t ud_itab__408[] = { + /* 0 */ 457, 0, +}; + +static const uint16_t ud_itab__407[] = { + /* 0 */ GROUP(408), 0, 0, 0, +}; + +static const uint16_t ud_itab__410[] = { + /* 0 */ 458, 0, +}; + +static const uint16_t ud_itab__409[] = { + /* 0 */ GROUP(410), 0, 0, 0, +}; + +static const uint16_t ud_itab__412[] = { + /* 0 */ 459, 0, +}; + +static const uint16_t ud_itab__411[] = { + /* 0 */ GROUP(412), 0, 0, 0, +}; + +static const uint16_t ud_itab__414[] = { + /* 0 */ 460, 0, +}; + +static const uint16_t ud_itab__413[] = { + /* 0 */ GROUP(414), 0, 0, 0, +}; + +static const uint16_t ud_itab__416[] = { + /* 0 */ 461, 0, +}; + +static const uint16_t ud_itab__415[] = { + /* 0 */ GROUP(416), 0, 0, 0, +}; + +static const uint16_t ud_itab__402[] = { + /* 0 */ GROUP(403), GROUP(405), GROUP(407), GROUP(409), + /* 4 */ GROUP(411), GROUP(413), 0, GROUP(415), +}; + +static const uint16_t ud_itab__420[] = { + /* 0 */ 0, 462, +}; + +static const uint16_t ud_itab__419[] = { + /* 0 */ GROUP(420), 0, 0, 0, +}; + +static const uint16_t ud_itab__422[] = { + /* 0 */ 0, 463, +}; + +static const uint16_t ud_itab__421[] = { + /* 0 */ GROUP(422), 0, 0, 0, +}; + +static const uint16_t ud_itab__424[] = { + /* 0 */ 0, 464, +}; + +static const uint16_t ud_itab__423[] = { + /* 0 */ GROUP(424), 0, 0, 0, +}; + +static const uint16_t ud_itab__426[] = { + /* 0 */ 0, 465, +}; + +static const uint16_t ud_itab__425[] = { + /* 0 */ GROUP(426), 0, 0, 0, +}; + +static const uint16_t ud_itab__428[] = { + /* 0 */ 0, 466, +}; + +static const uint16_t ud_itab__427[] = { + /* 0 */ GROUP(428), 0, 0, 0, +}; + +static const uint16_t ud_itab__430[] = { + /* 0 */ 0, 467, +}; + +static const uint16_t ud_itab__429[] = { + /* 0 */ GROUP(430), 0, 0, 0, +}; + +static const uint16_t ud_itab__432[] = { + /* 0 */ 0, 468, +}; + +static const uint16_t ud_itab__431[] = { + /* 0 */ GROUP(432), 0, 0, 0, +}; + +static const uint16_t ud_itab__434[] = { + /* 0 */ 0, 469, +}; + +static const uint16_t ud_itab__433[] = { + /* 0 */ GROUP(434), 0, 0, 0, +}; + +static const uint16_t ud_itab__418[] = { + /* 0 */ GROUP(419), GROUP(421), GROUP(423), GROUP(425), + /* 4 */ GROUP(427), GROUP(429), GROUP(431), GROUP(433), +}; + +static const uint16_t ud_itab__437[] = { + /* 0 */ 0, 470, +}; + +static const uint16_t ud_itab__436[] = { + /* 0 */ GROUP(437), 0, 0, 0, +}; + +static const uint16_t ud_itab__439[] = { + /* 0 */ 0, 471, +}; + +static const uint16_t ud_itab__438[] = { + /* 0 */ GROUP(439), 0, 0, 0, +}; + +static const uint16_t ud_itab__441[] = { + /* 0 */ 0, 472, +}; + +static const uint16_t ud_itab__440[] = { + /* 0 */ GROUP(441), 0, 0, 0, +}; + +static const uint16_t ud_itab__443[] = { + /* 0 */ 0, 473, +}; + +static const uint16_t ud_itab__442[] = { + /* 0 */ GROUP(443), 0, 0, 0, +}; + +static const uint16_t ud_itab__445[] = { + /* 0 */ 0, 474, +}; + +static const uint16_t ud_itab__444[] = { + /* 0 */ GROUP(445), 0, 0, 0, +}; + +static const uint16_t ud_itab__447[] = { + /* 0 */ 0, 475, +}; + +static const uint16_t ud_itab__446[] = { + /* 0 */ GROUP(447), 0, 0, 0, +}; + +static const uint16_t ud_itab__449[] = { + /* 0 */ 0, 476, +}; + +static const uint16_t ud_itab__448[] = { + /* 0 */ GROUP(449), 0, 0, 0, +}; + +static const uint16_t ud_itab__451[] = { + /* 0 */ 0, 477, +}; + +static const uint16_t ud_itab__450[] = { + /* 0 */ GROUP(451), 0, 0, 0, +}; + +static const uint16_t ud_itab__435[] = { + /* 0 */ GROUP(436), GROUP(438), GROUP(440), GROUP(442), + /* 4 */ GROUP(444), GROUP(446), GROUP(448), GROUP(450), +}; + +static const uint16_t ud_itab__454[] = { + /* 0 */ 0, 478, +}; + +static const uint16_t ud_itab__453[] = { + /* 0 */ GROUP(454), 0, 0, 0, +}; + +static const uint16_t ud_itab__456[] = { + /* 0 */ 0, 479, +}; + +static const uint16_t ud_itab__455[] = { + /* 0 */ GROUP(456), 0, 0, 0, +}; + +static const uint16_t ud_itab__458[] = { + /* 0 */ 0, 480, +}; + +static const uint16_t ud_itab__457[] = { + /* 0 */ GROUP(458), 0, 0, 0, +}; + +static const uint16_t ud_itab__460[] = { + /* 0 */ 0, 481, +}; + +static const uint16_t ud_itab__459[] = { + /* 0 */ GROUP(460), 0, 0, 0, +}; + +static const uint16_t ud_itab__462[] = { + /* 0 */ 0, 482, +}; + +static const uint16_t ud_itab__461[] = { + /* 0 */ GROUP(462), 0, 0, 0, +}; + +static const uint16_t ud_itab__464[] = { + /* 0 */ 0, 483, +}; + +static const uint16_t ud_itab__463[] = { + /* 0 */ GROUP(464), 0, 0, 0, +}; + +static const uint16_t ud_itab__466[] = { + /* 0 */ 0, 484, +}; + +static const uint16_t ud_itab__465[] = { + /* 0 */ GROUP(466), 0, 0, 0, +}; + +static const uint16_t ud_itab__468[] = { + /* 0 */ 0, 485, +}; + +static const uint16_t ud_itab__467[] = { + /* 0 */ GROUP(468), 0, 0, 0, +}; + +static const uint16_t ud_itab__452[] = { + /* 0 */ GROUP(453), GROUP(455), GROUP(457), GROUP(459), + /* 4 */ GROUP(461), GROUP(463), GROUP(465), GROUP(467), +}; + +static const uint16_t ud_itab__417[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, GROUP(418), GROUP(435), GROUP(452), +}; + +static const uint16_t ud_itab__401[] = { + /* 0 */ GROUP(402), GROUP(417), +}; + +static const uint16_t ud_itab__469[] = { + /* 0 */ 486, 0, 0, 0, +}; + +static const uint16_t ud_itab__470[] = { + /* 0 */ 487, 0, 0, 0, +}; + +static const uint16_t ud_itab__471[] = { + /* 0 */ 488, 0, 0, 0, +}; + +static const uint16_t ud_itab__472[] = { + /* 0 */ 489, 0, 0, 0, +}; + +static const uint16_t ud_itab__473[] = { + /* 0 */ 490, 0, 0, 0, +}; + +static const uint16_t ud_itab__474[] = { + /* 0 */ 491, 0, 0, 0, +}; + +static const uint16_t ud_itab__475[] = { + /* 0 */ 492, 0, 0, 0, +}; + +static const uint16_t ud_itab__476[] = { + /* 0 */ 493, 0, 0, 0, +}; + +static const uint16_t ud_itab__477[] = { + /* 0 */ 494, 0, 0, 0, +}; + +static const uint16_t ud_itab__478[] = { + /* 0 */ 0, 0, 495, 0, +}; + +static const uint16_t ud_itab__480[] = { + /* 0 */ 496, 0, 0, 0, +}; + +static const uint16_t ud_itab__481[] = { + /* 0 */ 497, 0, 0, 0, +}; + +static const uint16_t ud_itab__482[] = { + /* 0 */ 498, 0, 0, 0, +}; + +static const uint16_t ud_itab__483[] = { + /* 0 */ 499, 0, 0, 0, +}; + +static const uint16_t ud_itab__479[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ GROUP(480), GROUP(481), GROUP(482), GROUP(483), +}; + +static const uint16_t ud_itab__484[] = { + /* 0 */ 500, 0, 0, 0, +}; + +static const uint16_t ud_itab__485[] = { + /* 0 */ 501, 0, 0, 0, +}; + +static const uint16_t ud_itab__486[] = { + /* 0 */ 502, 0, 0, 0, +}; + +static const uint16_t ud_itab__487[] = { + /* 0 */ 503, 0, 0, 0, +}; + +static const uint16_t ud_itab__488[] = { + /* 0 */ 504, 0, 0, 0, +}; + +static const uint16_t ud_itab__489[] = { + /* 0 */ 505, 0, 0, 0, +}; + +static const uint16_t ud_itab__490[] = { + /* 0 */ 506, 0, 0, 0, +}; + +static const uint16_t ud_itab__491[] = { + /* 0 */ 507, 508, 509, 510, +}; + +static const uint16_t ud_itab__492[] = { + /* 0 */ 511, 0, 0, 0, +}; + +static const uint16_t ud_itab__493[] = { + /* 0 */ 512, 0, 0, 513, +}; + +static const uint16_t ud_itab__494[] = { + /* 0 */ 514, 0, 0, 515, +}; + +static const uint16_t ud_itab__495[] = { + /* 0 */ 516, 0, 0, 517, +}; + +static const uint16_t ud_itab__498[] = { + /* 0 */ 518, 519, 520, +}; + +static const uint16_t ud_itab__497[] = { + /* 0 */ GROUP(498), 0, 0, 0, +}; + +static const uint16_t ud_itab__500[] = { + /* 0 */ 0, 521, 0, +}; + +static const uint16_t ud_itab__501[] = { + /* 0 */ 0, 522, 0, +}; + +static const uint16_t ud_itab__502[] = { + /* 0 */ 0, 523, 0, +}; + +static const uint16_t ud_itab__499[] = { + /* 0 */ GROUP(500), 0, GROUP(501), GROUP(502), +}; + +static const uint16_t ud_itab__504[] = { + /* 0 */ 0, 524, 0, +}; + +static const uint16_t ud_itab__503[] = { + /* 0 */ GROUP(504), 0, 0, 0, +}; + +static const uint16_t ud_itab__496[] = { + /* 0 */ 0, GROUP(497), 0, 0, + /* 4 */ 0, 0, GROUP(499), GROUP(503), +}; + +static const uint16_t ud_itab__505[] = { + /* 0 */ 525, 0, 0, 0, +}; + +static const uint16_t ud_itab__506[] = { + /* 0 */ 526, 0, 0, 0, +}; + +static const uint16_t ud_itab__507[] = { + /* 0 */ 527, 0, 0, 0, +}; + +static const uint16_t ud_itab__508[] = { + /* 0 */ 528, 0, 0, 0, +}; + +static const uint16_t ud_itab__509[] = { + /* 0 */ 529, 0, 0, 0, +}; + +static const uint16_t ud_itab__510[] = { + /* 0 */ 530, 0, 0, 0, +}; + +static const uint16_t ud_itab__511[] = { + /* 0 */ 531, 0, 0, 0, +}; + +static const uint16_t ud_itab__512[] = { + /* 0 */ 532, 0, 0, 0, +}; + +static const uint16_t ud_itab__513[] = { + /* 0 */ 0, 533, 0, 534, +}; + +static const uint16_t ud_itab__514[] = { + /* 0 */ 535, 0, 0, 536, +}; + +static const uint16_t ud_itab__515[] = { + /* 0 */ 537, 0, 0, 538, +}; + +static const uint16_t ud_itab__516[] = { + /* 0 */ 539, 0, 0, 540, +}; + +static const uint16_t ud_itab__517[] = { + /* 0 */ 541, 0, 0, 542, +}; + +static const uint16_t ud_itab__518[] = { + /* 0 */ 543, 0, 0, 544, +}; + +static const uint16_t ud_itab__519[] = { + /* 0 */ 0, 545, 546, 547, +}; + +static const uint16_t ud_itab__520[] = { + /* 0 */ 548, 0, 0, 549, +}; + +static const uint16_t ud_itab__521[] = { + /* 0 */ 550, 0, 0, 551, +}; + +static const uint16_t ud_itab__522[] = { + /* 0 */ 552, 0, 0, 553, +}; + +static const uint16_t ud_itab__523[] = { + /* 0 */ 554, 0, 0, 555, +}; + +static const uint16_t ud_itab__524[] = { + /* 0 */ 556, 0, 0, 557, +}; + +static const uint16_t ud_itab__525[] = { + /* 0 */ 558, 0, 0, 559, +}; + +static const uint16_t ud_itab__526[] = { + /* 0 */ 560, 0, 0, 561, +}; + +static const uint16_t ud_itab__527[] = { + /* 0 */ 562, 0, 0, 563, +}; + +static const uint16_t ud_itab__528[] = { + /* 0 */ 564, 0, 0, 565, +}; + +static const uint16_t ud_itab__529[] = { + /* 0 */ 566, 0, 0, 567, +}; + +static const uint16_t ud_itab__530[] = { + /* 0 */ 568, 0, 0, 569, +}; + +static const uint16_t ud_itab__531[] = { + /* 0 */ 570, 0, 0, 571, +}; + +static const uint16_t ud_itab__532[] = { + /* 0 */ 572, 0, 0, 573, +}; + +static const uint16_t ud_itab__533[] = { + /* 0 */ 574, 0, 0, 575, +}; + +static const uint16_t ud_itab__534[] = { + /* 0 */ 576, 0, 0, 577, +}; + +static const uint16_t ud_itab__535[] = { + /* 0 */ 0, 578, 579, 580, +}; + +static const uint16_t ud_itab__536[] = { + /* 0 */ 581, 0, 0, 582, +}; + +static const uint16_t ud_itab__537[] = { + /* 0 */ 583, 0, 0, 584, +}; + +static const uint16_t ud_itab__538[] = { + /* 0 */ 585, 0, 0, 586, +}; + +static const uint16_t ud_itab__539[] = { + /* 0 */ 587, 0, 0, 588, +}; + +static const uint16_t ud_itab__540[] = { + /* 0 */ 589, 0, 0, 590, +}; + +static const uint16_t ud_itab__541[] = { + /* 0 */ 591, 0, 0, 592, +}; + +static const uint16_t ud_itab__542[] = { + /* 0 */ 593, 0, 0, 594, +}; + +static const uint16_t ud_itab__543[] = { + /* 0 */ 595, 0, 0, 596, +}; + +static const uint16_t ud_itab__544[] = { + /* 0 */ 597, 0, 0, 598, +}; + +static const uint16_t ud_itab__545[] = { + /* 0 */ 0, 599, 0, 0, +}; + +static const uint16_t ud_itab__546[] = { + /* 0 */ 600, 0, 0, 601, +}; + +static const uint16_t ud_itab__547[] = { + /* 0 */ 602, 0, 0, 603, +}; + +static const uint16_t ud_itab__548[] = { + /* 0 */ 604, 0, 0, 605, +}; + +static const uint16_t ud_itab__549[] = { + /* 0 */ 606, 0, 0, 607, +}; + +static const uint16_t ud_itab__550[] = { + /* 0 */ 608, 0, 0, 609, +}; + +static const uint16_t ud_itab__551[] = { + /* 0 */ 610, 0, 0, 611, +}; + +static const uint16_t ud_itab__554[] = { + /* 0 */ 0, 612, +}; + +static const uint16_t ud_itab__555[] = { + /* 0 */ 0, 613, +}; + +static const uint16_t ud_itab__553[] = { + /* 0 */ GROUP(554), 0, 0, GROUP(555), +}; + +static const uint16_t ud_itab__552[] = { + /* 0 */ 0, GROUP(553), +}; + +static const uint16_t ud_itab__556[] = { + /* 0 */ 614, 0, 0, 615, +}; + +static const uint16_t ud_itab__557[] = { + /* 0 */ 616, 0, 0, 617, +}; + +static const uint16_t ud_itab__558[] = { + /* 0 */ 618, 0, 0, 619, +}; + +static const uint16_t ud_itab__559[] = { + /* 0 */ 620, 0, 0, 621, +}; + +static const uint16_t ud_itab__560[] = { + /* 0 */ 622, 0, 0, 623, +}; + +static const uint16_t ud_itab__561[] = { + /* 0 */ 624, 0, 0, 625, +}; + +static const uint16_t ud_itab__562[] = { + /* 0 */ 626, 0, 0, 627, +}; + +static const uint16_t ud_itab__4[] = { + /* 0 */ GROUP(5), GROUP(12), GROUP(87), GROUP(88), + /* 4 */ 0, GROUP(89), GROUP(90), GROUP(91), + /* 8 */ GROUP(92), GROUP(93), 0, GROUP(94), + /* c */ 0, GROUP(95), GROUP(104), GROUP(105), + /* 10 */ GROUP(106), GROUP(107), GROUP(108), GROUP(118), + /* 14 */ GROUP(119), GROUP(120), GROUP(121), GROUP(129), + /* 18 */ GROUP(130), GROUP(135), GROUP(136), GROUP(137), + /* 1c */ GROUP(138), GROUP(139), GROUP(140), GROUP(141), + /* 20 */ GROUP(142), GROUP(143), GROUP(144), GROUP(145), + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(146), GROUP(147), GROUP(148), GROUP(149), + /* 2c */ GROUP(150), GROUP(151), GROUP(152), GROUP(153), + /* 30 */ GROUP(154), GROUP(155), GROUP(156), GROUP(157), + /* 34 */ GROUP(158), GROUP(161), 0, GROUP(164), + /* 38 */ GROUP(165), 0, GROUP(225), 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ GROUP(252), GROUP(253), GROUP(254), GROUP(255), + /* 44 */ GROUP(256), GROUP(257), GROUP(258), GROUP(259), + /* 48 */ GROUP(260), GROUP(261), GROUP(262), GROUP(263), + /* 4c */ GROUP(264), GROUP(265), GROUP(266), GROUP(267), + /* 50 */ GROUP(268), GROUP(269), GROUP(270), GROUP(271), + /* 54 */ GROUP(272), GROUP(273), GROUP(274), GROUP(275), + /* 58 */ GROUP(276), GROUP(277), GROUP(278), GROUP(279), + /* 5c */ GROUP(280), GROUP(281), GROUP(282), GROUP(283), + /* 60 */ GROUP(284), GROUP(285), GROUP(286), GROUP(287), + /* 64 */ GROUP(288), GROUP(289), GROUP(290), GROUP(291), + /* 68 */ GROUP(292), GROUP(293), GROUP(294), GROUP(295), + /* 6c */ GROUP(296), GROUP(297), GROUP(298), GROUP(299), + /* 70 */ GROUP(300), GROUP(301), GROUP(305), GROUP(309), + /* 74 */ GROUP(314), GROUP(315), GROUP(316), GROUP(317), + /* 78 */ GROUP(318), GROUP(320), 0, 0, + /* 7c */ GROUP(322), GROUP(323), GROUP(324), GROUP(325), + /* 80 */ GROUP(326), GROUP(327), GROUP(328), GROUP(329), + /* 84 */ GROUP(330), GROUP(331), GROUP(332), GROUP(333), + /* 88 */ GROUP(334), GROUP(335), GROUP(336), GROUP(337), + /* 8c */ GROUP(338), GROUP(339), GROUP(340), GROUP(341), + /* 90 */ GROUP(342), GROUP(343), GROUP(344), GROUP(345), + /* 94 */ GROUP(346), GROUP(347), GROUP(348), GROUP(349), + /* 98 */ GROUP(350), GROUP(351), GROUP(352), GROUP(353), + /* 9c */ GROUP(354), GROUP(355), GROUP(356), GROUP(357), + /* a0 */ GROUP(358), GROUP(359), GROUP(360), GROUP(361), + /* a4 */ GROUP(362), GROUP(363), GROUP(364), GROUP(375), + /* a8 */ GROUP(395), GROUP(396), GROUP(397), GROUP(398), + /* ac */ GROUP(399), GROUP(400), GROUP(401), GROUP(469), + /* b0 */ GROUP(470), GROUP(471), GROUP(472), GROUP(473), + /* b4 */ GROUP(474), GROUP(475), GROUP(476), GROUP(477), + /* b8 */ GROUP(478), 0, GROUP(479), GROUP(484), + /* bc */ GROUP(485), GROUP(486), GROUP(487), GROUP(488), + /* c0 */ GROUP(489), GROUP(490), GROUP(491), GROUP(492), + /* c4 */ GROUP(493), GROUP(494), GROUP(495), GROUP(496), + /* c8 */ GROUP(505), GROUP(506), GROUP(507), GROUP(508), + /* cc */ GROUP(509), GROUP(510), GROUP(511), GROUP(512), + /* d0 */ GROUP(513), GROUP(514), GROUP(515), GROUP(516), + /* d4 */ GROUP(517), GROUP(518), GROUP(519), GROUP(520), + /* d8 */ GROUP(521), GROUP(522), GROUP(523), GROUP(524), + /* dc */ GROUP(525), GROUP(526), GROUP(527), GROUP(528), + /* e0 */ GROUP(529), GROUP(530), GROUP(531), GROUP(532), + /* e4 */ GROUP(533), GROUP(534), GROUP(535), GROUP(536), + /* e8 */ GROUP(537), GROUP(538), GROUP(539), GROUP(540), + /* ec */ GROUP(541), GROUP(542), GROUP(543), GROUP(544), + /* f0 */ GROUP(545), GROUP(546), GROUP(547), GROUP(548), + /* f4 */ GROUP(549), GROUP(550), GROUP(551), GROUP(552), + /* f8 */ GROUP(556), GROUP(557), GROUP(558), GROUP(559), + /* fc */ GROUP(560), GROUP(561), GROUP(562), 0, +}; + +static const uint16_t ud_itab__563[] = { + /* 0 */ 634, 0, +}; + +static const uint16_t ud_itab__564[] = { + /* 0 */ 635, 0, +}; + +static const uint16_t ud_itab__565[] = { + /* 0 */ 642, 0, +}; + +static const uint16_t ud_itab__566[] = { + /* 0 */ 643, 0, +}; + +static const uint16_t ud_itab__567[] = { + /* 0 */ 650, 0, +}; + +static const uint16_t ud_itab__568[] = { + /* 0 */ 657, 0, +}; + +static const uint16_t ud_itab__569[] = { + /* 0 */ 664, 0, +}; + +static const uint16_t ud_itab__570[] = { + /* 0 */ 671, 0, +}; + +static const uint16_t ud_itab__572[] = { + /* 0 */ 704, 0, +}; + +static const uint16_t ud_itab__573[] = { + /* 0 */ 705, 0, +}; + +static const uint16_t ud_itab__571[] = { + /* 0 */ GROUP(572), GROUP(573), 0, +}; + +static const uint16_t ud_itab__575[] = { + /* 0 */ 706, 0, +}; + +static const uint16_t ud_itab__576[] = { + /* 0 */ 707, 0, +}; + +static const uint16_t ud_itab__574[] = { + /* 0 */ GROUP(575), GROUP(576), 0, +}; + +static const uint16_t ud_itab__577[] = { + /* 0 */ 708, 0, +}; + +static const uint16_t ud_itab__578[] = { + /* 0 */ 709, 710, +}; + +static const uint16_t ud_itab__579[] = { + /* 0 */ 716, 717, 0, +}; + +static const uint16_t ud_itab__580[] = { + /* 0 */ 719, 720, 0, +}; + +static const uint16_t ud_itab__581[] = { + /* 0 */ 737, 738, 739, 740, + /* 4 */ 741, 742, 743, 744, +}; + +static const uint16_t ud_itab__582[] = { + /* 0 */ 745, 746, 747, 748, + /* 4 */ 749, 750, 751, 752, +}; + +static const uint16_t ud_itab__584[] = { + /* 0 */ 753, 0, +}; + +static const uint16_t ud_itab__585[] = { + /* 0 */ 754, 0, +}; + +static const uint16_t ud_itab__586[] = { + /* 0 */ 755, 0, +}; + +static const uint16_t ud_itab__587[] = { + /* 0 */ 756, 0, +}; + +static const uint16_t ud_itab__588[] = { + /* 0 */ 757, 0, +}; + +static const uint16_t ud_itab__589[] = { + /* 0 */ 758, 0, +}; + +static const uint16_t ud_itab__590[] = { + /* 0 */ 759, 0, +}; + +static const uint16_t ud_itab__591[] = { + /* 0 */ 760, 0, +}; + +static const uint16_t ud_itab__583[] = { + /* 0 */ GROUP(584), GROUP(585), GROUP(586), GROUP(587), + /* 4 */ GROUP(588), GROUP(589), GROUP(590), GROUP(591), +}; + +static const uint16_t ud_itab__592[] = { + /* 0 */ 761, 762, 763, 764, + /* 4 */ 765, 766, 767, 768, +}; + +static const uint16_t ud_itab__593[] = { + /* 0 */ 780, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__594[] = { + /* 0 */ 789, 790, 791, +}; + +static const uint16_t ud_itab__595[] = { + /* 0 */ 792, 793, 794, +}; + +static const uint16_t ud_itab__596[] = { + /* 0 */ 795, 0, +}; + +static const uint16_t ud_itab__598[] = { + /* 0 */ 797, 798, +}; + +static const uint16_t ud_itab__599[] = { + /* 0 */ 799, 800, +}; + +static const uint16_t ud_itab__600[] = { + /* 0 */ 0, 801, +}; + +static const uint16_t ud_itab__597[] = { + /* 0 */ GROUP(598), GROUP(599), GROUP(600), +}; + +static const uint16_t ud_itab__602[] = { + /* 0 */ 802, 0, +}; + +static const uint16_t ud_itab__603[] = { + /* 0 */ 803, 804, +}; + +static const uint16_t ud_itab__604[] = { + /* 0 */ 0, 805, +}; + +static const uint16_t ud_itab__601[] = { + /* 0 */ GROUP(602), GROUP(603), GROUP(604), +}; + +static const uint16_t ud_itab__605[] = { + /* 0 */ 813, 814, 815, +}; + +static const uint16_t ud_itab__606[] = { + /* 0 */ 817, 818, 819, +}; + +static const uint16_t ud_itab__607[] = { + /* 0 */ 823, 824, 825, +}; + +static const uint16_t ud_itab__608[] = { + /* 0 */ 827, 828, 829, +}; + +static const uint16_t ud_itab__609[] = { + /* 0 */ 831, 832, 833, +}; + +static const uint16_t ud_itab__610[] = { + /* 0 */ 850, 851, 852, 853, + /* 4 */ 854, 855, 856, 857, +}; + +static const uint16_t ud_itab__611[] = { + /* 0 */ 858, 859, 860, 861, + /* 4 */ 862, 863, 864, 865, +}; + +static const uint16_t ud_itab__612[] = { + /* 0 */ 868, 0, +}; + +static const uint16_t ud_itab__613[] = { + /* 0 */ 869, 0, +}; + +static const uint16_t ud_itab__614[] = { + /* 0 */ 870, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__615[] = { + /* 0 */ 871, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__616[] = { + /* 0 */ 878, 0, +}; + +static const uint16_t ud_itab__617[] = { + /* 0 */ 879, 880, 881, +}; + +static const uint16_t ud_itab__618[] = { + /* 0 */ 882, 883, 884, 885, + /* 4 */ 886, 887, 888, 889, +}; + +static const uint16_t ud_itab__619[] = { + /* 0 */ 890, 891, 892, 893, + /* 4 */ 894, 895, 896, 897, +}; + +static const uint16_t ud_itab__620[] = { + /* 0 */ 898, 899, 900, 901, + /* 4 */ 902, 903, 904, 905, +}; + +static const uint16_t ud_itab__621[] = { + /* 0 */ 906, 907, 908, 909, + /* 4 */ 910, 911, 912, 913, +}; + +static const uint16_t ud_itab__622[] = { + /* 0 */ 914, 0, +}; + +static const uint16_t ud_itab__623[] = { + /* 0 */ 915, 0, +}; + +static const uint16_t ud_itab__624[] = { + /* 0 */ 916, 0, +}; + +static const uint16_t ud_itab__627[] = { + /* 0 */ 918, 0, +}; + +static const uint16_t ud_itab__628[] = { + /* 0 */ 919, 0, +}; + +static const uint16_t ud_itab__629[] = { + /* 0 */ 920, 0, +}; + +static const uint16_t ud_itab__630[] = { + /* 0 */ 921, 0, +}; + +static const uint16_t ud_itab__631[] = { + /* 0 */ 922, 0, +}; + +static const uint16_t ud_itab__632[] = { + /* 0 */ 923, 0, +}; + +static const uint16_t ud_itab__633[] = { + /* 0 */ 924, 0, +}; + +static const uint16_t ud_itab__634[] = { + /* 0 */ 925, 0, +}; + +static const uint16_t ud_itab__626[] = { + /* 0 */ GROUP(627), GROUP(628), GROUP(629), GROUP(630), + /* 4 */ GROUP(631), GROUP(632), GROUP(633), GROUP(634), +}; + +static const uint16_t ud_itab__636[] = { + /* 0 */ 0, 926, +}; + +static const uint16_t ud_itab__637[] = { + /* 0 */ 0, 927, +}; + +static const uint16_t ud_itab__638[] = { + /* 0 */ 0, 928, +}; + +static const uint16_t ud_itab__639[] = { + /* 0 */ 0, 929, +}; + +static const uint16_t ud_itab__640[] = { + /* 0 */ 0, 930, +}; + +static const uint16_t ud_itab__641[] = { + /* 0 */ 0, 931, +}; + +static const uint16_t ud_itab__642[] = { + /* 0 */ 0, 932, +}; + +static const uint16_t ud_itab__643[] = { + /* 0 */ 0, 933, +}; + +static const uint16_t ud_itab__644[] = { + /* 0 */ 0, 934, +}; + +static const uint16_t ud_itab__645[] = { + /* 0 */ 0, 935, +}; + +static const uint16_t ud_itab__646[] = { + /* 0 */ 0, 936, +}; + +static const uint16_t ud_itab__647[] = { + /* 0 */ 0, 937, +}; + +static const uint16_t ud_itab__648[] = { + /* 0 */ 0, 938, +}; + +static const uint16_t ud_itab__649[] = { + /* 0 */ 0, 939, +}; + +static const uint16_t ud_itab__650[] = { + /* 0 */ 0, 940, +}; + +static const uint16_t ud_itab__651[] = { + /* 0 */ 0, 941, +}; + +static const uint16_t ud_itab__652[] = { + /* 0 */ 0, 942, +}; + +static const uint16_t ud_itab__653[] = { + /* 0 */ 0, 943, +}; + +static const uint16_t ud_itab__654[] = { + /* 0 */ 0, 944, +}; + +static const uint16_t ud_itab__655[] = { + /* 0 */ 0, 945, +}; + +static const uint16_t ud_itab__656[] = { + /* 0 */ 0, 946, +}; + +static const uint16_t ud_itab__657[] = { + /* 0 */ 0, 947, +}; + +static const uint16_t ud_itab__658[] = { + /* 0 */ 0, 948, +}; + +static const uint16_t ud_itab__659[] = { + /* 0 */ 0, 949, +}; + +static const uint16_t ud_itab__660[] = { + /* 0 */ 0, 950, +}; + +static const uint16_t ud_itab__661[] = { + /* 0 */ 0, 951, +}; + +static const uint16_t ud_itab__662[] = { + /* 0 */ 0, 952, +}; + +static const uint16_t ud_itab__663[] = { + /* 0 */ 0, 953, +}; + +static const uint16_t ud_itab__664[] = { + /* 0 */ 0, 954, +}; + +static const uint16_t ud_itab__665[] = { + /* 0 */ 0, 955, +}; + +static const uint16_t ud_itab__666[] = { + /* 0 */ 0, 956, +}; + +static const uint16_t ud_itab__667[] = { + /* 0 */ 0, 957, +}; + +static const uint16_t ud_itab__668[] = { + /* 0 */ 0, 958, +}; + +static const uint16_t ud_itab__669[] = { + /* 0 */ 0, 959, +}; + +static const uint16_t ud_itab__670[] = { + /* 0 */ 0, 960, +}; + +static const uint16_t ud_itab__671[] = { + /* 0 */ 0, 961, +}; + +static const uint16_t ud_itab__672[] = { + /* 0 */ 0, 962, +}; + +static const uint16_t ud_itab__673[] = { + /* 0 */ 0, 963, +}; + +static const uint16_t ud_itab__674[] = { + /* 0 */ 0, 964, +}; + +static const uint16_t ud_itab__675[] = { + /* 0 */ 0, 965, +}; + +static const uint16_t ud_itab__676[] = { + /* 0 */ 0, 966, +}; + +static const uint16_t ud_itab__677[] = { + /* 0 */ 0, 967, +}; + +static const uint16_t ud_itab__678[] = { + /* 0 */ 0, 968, +}; + +static const uint16_t ud_itab__679[] = { + /* 0 */ 0, 969, +}; + +static const uint16_t ud_itab__680[] = { + /* 0 */ 0, 970, +}; + +static const uint16_t ud_itab__681[] = { + /* 0 */ 0, 971, +}; + +static const uint16_t ud_itab__682[] = { + /* 0 */ 0, 972, +}; + +static const uint16_t ud_itab__683[] = { + /* 0 */ 0, 973, +}; + +static const uint16_t ud_itab__684[] = { + /* 0 */ 0, 974, +}; + +static const uint16_t ud_itab__685[] = { + /* 0 */ 0, 975, +}; + +static const uint16_t ud_itab__686[] = { + /* 0 */ 0, 976, +}; + +static const uint16_t ud_itab__687[] = { + /* 0 */ 0, 977, +}; + +static const uint16_t ud_itab__688[] = { + /* 0 */ 0, 978, +}; + +static const uint16_t ud_itab__689[] = { + /* 0 */ 0, 979, +}; + +static const uint16_t ud_itab__690[] = { + /* 0 */ 0, 980, +}; + +static const uint16_t ud_itab__691[] = { + /* 0 */ 0, 981, +}; + +static const uint16_t ud_itab__692[] = { + /* 0 */ 0, 982, +}; + +static const uint16_t ud_itab__693[] = { + /* 0 */ 0, 983, +}; + +static const uint16_t ud_itab__694[] = { + /* 0 */ 0, 984, +}; + +static const uint16_t ud_itab__695[] = { + /* 0 */ 0, 985, +}; + +static const uint16_t ud_itab__696[] = { + /* 0 */ 0, 986, +}; + +static const uint16_t ud_itab__697[] = { + /* 0 */ 0, 987, +}; + +static const uint16_t ud_itab__698[] = { + /* 0 */ 0, 988, +}; + +static const uint16_t ud_itab__699[] = { + /* 0 */ 0, 989, +}; + +static const uint16_t ud_itab__635[] = { + /* 0 */ GROUP(636), GROUP(637), GROUP(638), GROUP(639), + /* 4 */ GROUP(640), GROUP(641), GROUP(642), GROUP(643), + /* 8 */ GROUP(644), GROUP(645), GROUP(646), GROUP(647), + /* c */ GROUP(648), GROUP(649), GROUP(650), GROUP(651), + /* 10 */ GROUP(652), GROUP(653), GROUP(654), GROUP(655), + /* 14 */ GROUP(656), GROUP(657), GROUP(658), GROUP(659), + /* 18 */ GROUP(660), GROUP(661), GROUP(662), GROUP(663), + /* 1c */ GROUP(664), GROUP(665), GROUP(666), GROUP(667), + /* 20 */ GROUP(668), GROUP(669), GROUP(670), GROUP(671), + /* 24 */ GROUP(672), GROUP(673), GROUP(674), GROUP(675), + /* 28 */ GROUP(676), GROUP(677), GROUP(678), GROUP(679), + /* 2c */ GROUP(680), GROUP(681), GROUP(682), GROUP(683), + /* 30 */ GROUP(684), GROUP(685), GROUP(686), GROUP(687), + /* 34 */ GROUP(688), GROUP(689), GROUP(690), GROUP(691), + /* 38 */ GROUP(692), GROUP(693), GROUP(694), GROUP(695), + /* 3c */ GROUP(696), GROUP(697), GROUP(698), GROUP(699), +}; + +static const uint16_t ud_itab__625[] = { + /* 0 */ GROUP(626), GROUP(635), +}; + +static const uint16_t ud_itab__702[] = { + /* 0 */ 990, 0, +}; + +static const uint16_t ud_itab__703[] = { + /* 0 */ 991, 0, +}; + +static const uint16_t ud_itab__704[] = { + /* 0 */ 992, 0, +}; + +static const uint16_t ud_itab__705[] = { + /* 0 */ 993, 0, +}; + +static const uint16_t ud_itab__706[] = { + /* 0 */ 994, 0, +}; + +static const uint16_t ud_itab__707[] = { + /* 0 */ 995, 0, +}; + +static const uint16_t ud_itab__708[] = { + /* 0 */ 996, 0, +}; + +static const uint16_t ud_itab__701[] = { + /* 0 */ GROUP(702), 0, GROUP(703), GROUP(704), + /* 4 */ GROUP(705), GROUP(706), GROUP(707), GROUP(708), +}; + +static const uint16_t ud_itab__710[] = { + /* 0 */ 0, 997, +}; + +static const uint16_t ud_itab__711[] = { + /* 0 */ 0, 998, +}; + +static const uint16_t ud_itab__712[] = { + /* 0 */ 0, 999, +}; + +static const uint16_t ud_itab__713[] = { + /* 0 */ 0, 1000, +}; + +static const uint16_t ud_itab__714[] = { + /* 0 */ 0, 1001, +}; + +static const uint16_t ud_itab__715[] = { + /* 0 */ 0, 1002, +}; + +static const uint16_t ud_itab__716[] = { + /* 0 */ 0, 1003, +}; + +static const uint16_t ud_itab__717[] = { + /* 0 */ 0, 1004, +}; + +static const uint16_t ud_itab__718[] = { + /* 0 */ 0, 1005, +}; + +static const uint16_t ud_itab__719[] = { + /* 0 */ 0, 1006, +}; + +static const uint16_t ud_itab__720[] = { + /* 0 */ 0, 1007, +}; + +static const uint16_t ud_itab__721[] = { + /* 0 */ 0, 1008, +}; + +static const uint16_t ud_itab__722[] = { + /* 0 */ 0, 1009, +}; + +static const uint16_t ud_itab__723[] = { + /* 0 */ 0, 1010, +}; + +static const uint16_t ud_itab__724[] = { + /* 0 */ 0, 1011, +}; + +static const uint16_t ud_itab__725[] = { + /* 0 */ 0, 1012, +}; + +static const uint16_t ud_itab__726[] = { + /* 0 */ 0, 1013, +}; + +static const uint16_t ud_itab__727[] = { + /* 0 */ 0, 1014, +}; + +static const uint16_t ud_itab__728[] = { + /* 0 */ 0, 1015, +}; + +static const uint16_t ud_itab__729[] = { + /* 0 */ 0, 1016, +}; + +static const uint16_t ud_itab__730[] = { + /* 0 */ 0, 1017, +}; + +static const uint16_t ud_itab__731[] = { + /* 0 */ 0, 1018, +}; + +static const uint16_t ud_itab__732[] = { + /* 0 */ 0, 1019, +}; + +static const uint16_t ud_itab__733[] = { + /* 0 */ 0, 1020, +}; + +static const uint16_t ud_itab__734[] = { + /* 0 */ 0, 1021, +}; + +static const uint16_t ud_itab__735[] = { + /* 0 */ 0, 1022, +}; + +static const uint16_t ud_itab__736[] = { + /* 0 */ 0, 1023, +}; + +static const uint16_t ud_itab__737[] = { + /* 0 */ 0, 1024, +}; + +static const uint16_t ud_itab__738[] = { + /* 0 */ 0, 1025, +}; + +static const uint16_t ud_itab__739[] = { + /* 0 */ 0, 1026, +}; + +static const uint16_t ud_itab__740[] = { + /* 0 */ 0, 1027, +}; + +static const uint16_t ud_itab__741[] = { + /* 0 */ 0, 1028, +}; + +static const uint16_t ud_itab__742[] = { + /* 0 */ 0, 1029, +}; + +static const uint16_t ud_itab__743[] = { + /* 0 */ 0, 1030, +}; + +static const uint16_t ud_itab__744[] = { + /* 0 */ 0, 1031, +}; + +static const uint16_t ud_itab__745[] = { + /* 0 */ 0, 1032, +}; + +static const uint16_t ud_itab__746[] = { + /* 0 */ 0, 1033, +}; + +static const uint16_t ud_itab__747[] = { + /* 0 */ 0, 1034, +}; + +static const uint16_t ud_itab__748[] = { + /* 0 */ 0, 1035, +}; + +static const uint16_t ud_itab__749[] = { + /* 0 */ 0, 1036, +}; + +static const uint16_t ud_itab__750[] = { + /* 0 */ 0, 1037, +}; + +static const uint16_t ud_itab__751[] = { + /* 0 */ 0, 1038, +}; + +static const uint16_t ud_itab__752[] = { + /* 0 */ 0, 1039, +}; + +static const uint16_t ud_itab__753[] = { + /* 0 */ 0, 1040, +}; + +static const uint16_t ud_itab__754[] = { + /* 0 */ 0, 1041, +}; + +static const uint16_t ud_itab__755[] = { + /* 0 */ 0, 1042, +}; + +static const uint16_t ud_itab__756[] = { + /* 0 */ 0, 1043, +}; + +static const uint16_t ud_itab__757[] = { + /* 0 */ 0, 1044, +}; + +static const uint16_t ud_itab__758[] = { + /* 0 */ 0, 1045, +}; + +static const uint16_t ud_itab__759[] = { + /* 0 */ 0, 1046, +}; + +static const uint16_t ud_itab__760[] = { + /* 0 */ 0, 1047, +}; + +static const uint16_t ud_itab__761[] = { + /* 0 */ 0, 1048, +}; + +static const uint16_t ud_itab__709[] = { + /* 0 */ GROUP(710), GROUP(711), GROUP(712), GROUP(713), + /* 4 */ GROUP(714), GROUP(715), GROUP(716), GROUP(717), + /* 8 */ GROUP(718), GROUP(719), GROUP(720), GROUP(721), + /* c */ GROUP(722), GROUP(723), GROUP(724), GROUP(725), + /* 10 */ GROUP(726), 0, 0, 0, + /* 14 */ 0, 0, 0, 0, + /* 18 */ GROUP(727), GROUP(728), GROUP(729), GROUP(730), + /* 1c */ GROUP(731), GROUP(732), GROUP(733), GROUP(734), + /* 20 */ GROUP(735), GROUP(736), 0, 0, + /* 24 */ GROUP(737), GROUP(738), 0, 0, + /* 28 */ GROUP(739), GROUP(740), GROUP(741), GROUP(742), + /* 2c */ GROUP(743), GROUP(744), GROUP(745), 0, + /* 30 */ GROUP(746), GROUP(747), GROUP(748), GROUP(749), + /* 34 */ GROUP(750), GROUP(751), GROUP(752), GROUP(753), + /* 38 */ GROUP(754), GROUP(755), GROUP(756), GROUP(757), + /* 3c */ GROUP(758), GROUP(759), GROUP(760), GROUP(761), +}; + +static const uint16_t ud_itab__700[] = { + /* 0 */ GROUP(701), GROUP(709), +}; + +static const uint16_t ud_itab__764[] = { + /* 0 */ 1049, 0, +}; + +static const uint16_t ud_itab__765[] = { + /* 0 */ 1050, 0, +}; + +static const uint16_t ud_itab__766[] = { + /* 0 */ 1051, 0, +}; + +static const uint16_t ud_itab__767[] = { + /* 0 */ 1052, 0, +}; + +static const uint16_t ud_itab__768[] = { + /* 0 */ 1053, 0, +}; + +static const uint16_t ud_itab__769[] = { + /* 0 */ 1054, 0, +}; + +static const uint16_t ud_itab__770[] = { + /* 0 */ 1055, 0, +}; + +static const uint16_t ud_itab__771[] = { + /* 0 */ 1056, 0, +}; + +static const uint16_t ud_itab__763[] = { + /* 0 */ GROUP(764), GROUP(765), GROUP(766), GROUP(767), + /* 4 */ GROUP(768), GROUP(769), GROUP(770), GROUP(771), +}; + +static const uint16_t ud_itab__773[] = { + /* 0 */ 0, 1057, +}; + +static const uint16_t ud_itab__774[] = { + /* 0 */ 0, 1058, +}; + +static const uint16_t ud_itab__775[] = { + /* 0 */ 0, 1059, +}; + +static const uint16_t ud_itab__776[] = { + /* 0 */ 0, 1060, +}; + +static const uint16_t ud_itab__777[] = { + /* 0 */ 0, 1061, +}; + +static const uint16_t ud_itab__778[] = { + /* 0 */ 0, 1062, +}; + +static const uint16_t ud_itab__779[] = { + /* 0 */ 0, 1063, +}; + +static const uint16_t ud_itab__780[] = { + /* 0 */ 0, 1064, +}; + +static const uint16_t ud_itab__781[] = { + /* 0 */ 0, 1065, +}; + +static const uint16_t ud_itab__782[] = { + /* 0 */ 0, 1066, +}; + +static const uint16_t ud_itab__783[] = { + /* 0 */ 0, 1067, +}; + +static const uint16_t ud_itab__784[] = { + /* 0 */ 0, 1068, +}; + +static const uint16_t ud_itab__785[] = { + /* 0 */ 0, 1069, +}; + +static const uint16_t ud_itab__786[] = { + /* 0 */ 0, 1070, +}; + +static const uint16_t ud_itab__787[] = { + /* 0 */ 0, 1071, +}; + +static const uint16_t ud_itab__788[] = { + /* 0 */ 0, 1072, +}; + +static const uint16_t ud_itab__789[] = { + /* 0 */ 0, 1073, +}; + +static const uint16_t ud_itab__790[] = { + /* 0 */ 0, 1074, +}; + +static const uint16_t ud_itab__791[] = { + /* 0 */ 0, 1075, +}; + +static const uint16_t ud_itab__792[] = { + /* 0 */ 0, 1076, +}; + +static const uint16_t ud_itab__793[] = { + /* 0 */ 0, 1077, +}; + +static const uint16_t ud_itab__794[] = { + /* 0 */ 0, 1078, +}; + +static const uint16_t ud_itab__795[] = { + /* 0 */ 0, 1079, +}; + +static const uint16_t ud_itab__796[] = { + /* 0 */ 0, 1080, +}; + +static const uint16_t ud_itab__797[] = { + /* 0 */ 0, 1081, +}; + +static const uint16_t ud_itab__798[] = { + /* 0 */ 0, 1082, +}; + +static const uint16_t ud_itab__799[] = { + /* 0 */ 0, 1083, +}; + +static const uint16_t ud_itab__800[] = { + /* 0 */ 0, 1084, +}; + +static const uint16_t ud_itab__801[] = { + /* 0 */ 0, 1085, +}; + +static const uint16_t ud_itab__802[] = { + /* 0 */ 0, 1086, +}; + +static const uint16_t ud_itab__803[] = { + /* 0 */ 0, 1087, +}; + +static const uint16_t ud_itab__804[] = { + /* 0 */ 0, 1088, +}; + +static const uint16_t ud_itab__805[] = { + /* 0 */ 0, 1089, +}; + +static const uint16_t ud_itab__772[] = { + /* 0 */ GROUP(773), GROUP(774), GROUP(775), GROUP(776), + /* 4 */ GROUP(777), GROUP(778), GROUP(779), GROUP(780), + /* 8 */ GROUP(781), GROUP(782), GROUP(783), GROUP(784), + /* c */ GROUP(785), GROUP(786), GROUP(787), GROUP(788), + /* 10 */ GROUP(789), GROUP(790), GROUP(791), GROUP(792), + /* 14 */ GROUP(793), GROUP(794), GROUP(795), GROUP(796), + /* 18 */ GROUP(797), GROUP(798), GROUP(799), GROUP(800), + /* 1c */ GROUP(801), GROUP(802), GROUP(803), GROUP(804), + /* 20 */ 0, 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, GROUP(805), 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__762[] = { + /* 0 */ GROUP(763), GROUP(772), +}; + +static const uint16_t ud_itab__808[] = { + /* 0 */ 1090, 0, +}; + +static const uint16_t ud_itab__809[] = { + /* 0 */ 1091, 0, +}; + +static const uint16_t ud_itab__810[] = { + /* 0 */ 1092, 0, +}; + +static const uint16_t ud_itab__811[] = { + /* 0 */ 1093, 0, +}; + +static const uint16_t ud_itab__812[] = { + /* 0 */ 1094, 0, +}; + +static const uint16_t ud_itab__813[] = { + /* 0 */ 1095, 0, +}; + +static const uint16_t ud_itab__807[] = { + /* 0 */ GROUP(808), GROUP(809), GROUP(810), GROUP(811), + /* 4 */ 0, GROUP(812), 0, GROUP(813), +}; + +static const uint16_t ud_itab__815[] = { + /* 0 */ 0, 1096, +}; + +static const uint16_t ud_itab__816[] = { + /* 0 */ 0, 1097, +}; + +static const uint16_t ud_itab__817[] = { + /* 0 */ 0, 1098, +}; + +static const uint16_t ud_itab__818[] = { + /* 0 */ 0, 1099, +}; + +static const uint16_t ud_itab__819[] = { + /* 0 */ 0, 1100, +}; + +static const uint16_t ud_itab__820[] = { + /* 0 */ 0, 1101, +}; + +static const uint16_t ud_itab__821[] = { + /* 0 */ 0, 1102, +}; + +static const uint16_t ud_itab__822[] = { + /* 0 */ 0, 1103, +}; + +static const uint16_t ud_itab__823[] = { + /* 0 */ 0, 1104, +}; + +static const uint16_t ud_itab__824[] = { + /* 0 */ 0, 1105, +}; + +static const uint16_t ud_itab__825[] = { + /* 0 */ 0, 1106, +}; + +static const uint16_t ud_itab__826[] = { + /* 0 */ 0, 1107, +}; + +static const uint16_t ud_itab__827[] = { + /* 0 */ 0, 1108, +}; + +static const uint16_t ud_itab__828[] = { + /* 0 */ 0, 1109, +}; + +static const uint16_t ud_itab__829[] = { + /* 0 */ 0, 1110, +}; + +static const uint16_t ud_itab__830[] = { + /* 0 */ 0, 1111, +}; + +static const uint16_t ud_itab__831[] = { + /* 0 */ 0, 1112, +}; + +static const uint16_t ud_itab__832[] = { + /* 0 */ 0, 1113, +}; + +static const uint16_t ud_itab__833[] = { + /* 0 */ 0, 1114, +}; + +static const uint16_t ud_itab__834[] = { + /* 0 */ 0, 1115, +}; + +static const uint16_t ud_itab__835[] = { + /* 0 */ 0, 1116, +}; + +static const uint16_t ud_itab__836[] = { + /* 0 */ 0, 1117, +}; + +static const uint16_t ud_itab__837[] = { + /* 0 */ 0, 1118, +}; + +static const uint16_t ud_itab__838[] = { + /* 0 */ 0, 1119, +}; + +static const uint16_t ud_itab__839[] = { + /* 0 */ 0, 1120, +}; + +static const uint16_t ud_itab__840[] = { + /* 0 */ 0, 1121, +}; + +static const uint16_t ud_itab__841[] = { + /* 0 */ 0, 1122, +}; + +static const uint16_t ud_itab__842[] = { + /* 0 */ 0, 1123, +}; + +static const uint16_t ud_itab__843[] = { + /* 0 */ 0, 1124, +}; + +static const uint16_t ud_itab__844[] = { + /* 0 */ 0, 1125, +}; + +static const uint16_t ud_itab__845[] = { + /* 0 */ 0, 1126, +}; + +static const uint16_t ud_itab__846[] = { + /* 0 */ 0, 1127, +}; + +static const uint16_t ud_itab__847[] = { + /* 0 */ 0, 1128, +}; + +static const uint16_t ud_itab__848[] = { + /* 0 */ 0, 1129, +}; + +static const uint16_t ud_itab__849[] = { + /* 0 */ 0, 1130, +}; + +static const uint16_t ud_itab__850[] = { + /* 0 */ 0, 1131, +}; + +static const uint16_t ud_itab__851[] = { + /* 0 */ 0, 1132, +}; + +static const uint16_t ud_itab__852[] = { + /* 0 */ 0, 1133, +}; + +static const uint16_t ud_itab__853[] = { + /* 0 */ 0, 1134, +}; + +static const uint16_t ud_itab__854[] = { + /* 0 */ 0, 1135, +}; + +static const uint16_t ud_itab__855[] = { + /* 0 */ 0, 1136, +}; + +static const uint16_t ud_itab__856[] = { + /* 0 */ 0, 1137, +}; + +static const uint16_t ud_itab__857[] = { + /* 0 */ 0, 1138, +}; + +static const uint16_t ud_itab__858[] = { + /* 0 */ 0, 1139, +}; + +static const uint16_t ud_itab__859[] = { + /* 0 */ 0, 1140, +}; + +static const uint16_t ud_itab__860[] = { + /* 0 */ 0, 1141, +}; + +static const uint16_t ud_itab__861[] = { + /* 0 */ 0, 1142, +}; + +static const uint16_t ud_itab__862[] = { + /* 0 */ 0, 1143, +}; + +static const uint16_t ud_itab__863[] = { + /* 0 */ 0, 1144, +}; + +static const uint16_t ud_itab__864[] = { + /* 0 */ 0, 1145, +}; + +static const uint16_t ud_itab__814[] = { + /* 0 */ GROUP(815), GROUP(816), GROUP(817), GROUP(818), + /* 4 */ GROUP(819), GROUP(820), GROUP(821), GROUP(822), + /* 8 */ GROUP(823), GROUP(824), GROUP(825), GROUP(826), + /* c */ GROUP(827), GROUP(828), GROUP(829), GROUP(830), + /* 10 */ GROUP(831), GROUP(832), GROUP(833), GROUP(834), + /* 14 */ GROUP(835), GROUP(836), GROUP(837), GROUP(838), + /* 18 */ GROUP(839), GROUP(840), GROUP(841), GROUP(842), + /* 1c */ GROUP(843), GROUP(844), GROUP(845), GROUP(846), + /* 20 */ 0, 0, GROUP(847), GROUP(848), + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(849), GROUP(850), GROUP(851), GROUP(852), + /* 2c */ GROUP(853), GROUP(854), GROUP(855), GROUP(856), + /* 30 */ GROUP(857), GROUP(858), GROUP(859), GROUP(860), + /* 34 */ GROUP(861), GROUP(862), GROUP(863), GROUP(864), + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__806[] = { + /* 0 */ GROUP(807), GROUP(814), +}; + +static const uint16_t ud_itab__867[] = { + /* 0 */ 1146, 0, +}; + +static const uint16_t ud_itab__868[] = { + /* 0 */ 1147, 0, +}; + +static const uint16_t ud_itab__869[] = { + /* 0 */ 1148, 0, +}; + +static const uint16_t ud_itab__870[] = { + /* 0 */ 1149, 0, +}; + +static const uint16_t ud_itab__871[] = { + /* 0 */ 1150, 0, +}; + +static const uint16_t ud_itab__872[] = { + /* 0 */ 1151, 0, +}; + +static const uint16_t ud_itab__873[] = { + /* 0 */ 1152, 0, +}; + +static const uint16_t ud_itab__874[] = { + /* 0 */ 1153, 0, +}; + +static const uint16_t ud_itab__866[] = { + /* 0 */ GROUP(867), GROUP(868), GROUP(869), GROUP(870), + /* 4 */ GROUP(871), GROUP(872), GROUP(873), GROUP(874), +}; + +static const uint16_t ud_itab__876[] = { + /* 0 */ 0, 1154, +}; + +static const uint16_t ud_itab__877[] = { + /* 0 */ 0, 1155, +}; + +static const uint16_t ud_itab__878[] = { + /* 0 */ 0, 1156, +}; + +static const uint16_t ud_itab__879[] = { + /* 0 */ 0, 1157, +}; + +static const uint16_t ud_itab__880[] = { + /* 0 */ 0, 1158, +}; + +static const uint16_t ud_itab__881[] = { + /* 0 */ 0, 1159, +}; + +static const uint16_t ud_itab__882[] = { + /* 0 */ 0, 1160, +}; + +static const uint16_t ud_itab__883[] = { + /* 0 */ 0, 1161, +}; + +static const uint16_t ud_itab__884[] = { + /* 0 */ 0, 1162, +}; + +static const uint16_t ud_itab__885[] = { + /* 0 */ 0, 1163, +}; + +static const uint16_t ud_itab__886[] = { + /* 0 */ 0, 1164, +}; + +static const uint16_t ud_itab__887[] = { + /* 0 */ 0, 1165, +}; + +static const uint16_t ud_itab__888[] = { + /* 0 */ 0, 1166, +}; + +static const uint16_t ud_itab__889[] = { + /* 0 */ 0, 1167, +}; + +static const uint16_t ud_itab__890[] = { + /* 0 */ 0, 1168, +}; + +static const uint16_t ud_itab__891[] = { + /* 0 */ 0, 1169, +}; + +static const uint16_t ud_itab__892[] = { + /* 0 */ 0, 1170, +}; + +static const uint16_t ud_itab__893[] = { + /* 0 */ 0, 1171, +}; + +static const uint16_t ud_itab__894[] = { + /* 0 */ 0, 1172, +}; + +static const uint16_t ud_itab__895[] = { + /* 0 */ 0, 1173, +}; + +static const uint16_t ud_itab__896[] = { + /* 0 */ 0, 1174, +}; + +static const uint16_t ud_itab__897[] = { + /* 0 */ 0, 1175, +}; + +static const uint16_t ud_itab__898[] = { + /* 0 */ 0, 1176, +}; + +static const uint16_t ud_itab__899[] = { + /* 0 */ 0, 1177, +}; + +static const uint16_t ud_itab__900[] = { + /* 0 */ 0, 1178, +}; + +static const uint16_t ud_itab__901[] = { + /* 0 */ 0, 1179, +}; + +static const uint16_t ud_itab__902[] = { + /* 0 */ 0, 1180, +}; + +static const uint16_t ud_itab__903[] = { + /* 0 */ 0, 1181, +}; + +static const uint16_t ud_itab__904[] = { + /* 0 */ 0, 1182, +}; + +static const uint16_t ud_itab__905[] = { + /* 0 */ 0, 1183, +}; + +static const uint16_t ud_itab__906[] = { + /* 0 */ 0, 1184, +}; + +static const uint16_t ud_itab__907[] = { + /* 0 */ 0, 1185, +}; + +static const uint16_t ud_itab__908[] = { + /* 0 */ 0, 1186, +}; + +static const uint16_t ud_itab__909[] = { + /* 0 */ 0, 1187, +}; + +static const uint16_t ud_itab__910[] = { + /* 0 */ 0, 1188, +}; + +static const uint16_t ud_itab__911[] = { + /* 0 */ 0, 1189, +}; + +static const uint16_t ud_itab__912[] = { + /* 0 */ 0, 1190, +}; + +static const uint16_t ud_itab__913[] = { + /* 0 */ 0, 1191, +}; + +static const uint16_t ud_itab__914[] = { + /* 0 */ 0, 1192, +}; + +static const uint16_t ud_itab__915[] = { + /* 0 */ 0, 1193, +}; + +static const uint16_t ud_itab__916[] = { + /* 0 */ 0, 1194, +}; + +static const uint16_t ud_itab__917[] = { + /* 0 */ 0, 1195, +}; + +static const uint16_t ud_itab__918[] = { + /* 0 */ 0, 1196, +}; + +static const uint16_t ud_itab__919[] = { + /* 0 */ 0, 1197, +}; + +static const uint16_t ud_itab__920[] = { + /* 0 */ 0, 1198, +}; + +static const uint16_t ud_itab__921[] = { + /* 0 */ 0, 1199, +}; + +static const uint16_t ud_itab__922[] = { + /* 0 */ 0, 1200, +}; + +static const uint16_t ud_itab__923[] = { + /* 0 */ 0, 1201, +}; + +static const uint16_t ud_itab__924[] = { + /* 0 */ 0, 1202, +}; + +static const uint16_t ud_itab__925[] = { + /* 0 */ 0, 1203, +}; + +static const uint16_t ud_itab__926[] = { + /* 0 */ 0, 1204, +}; + +static const uint16_t ud_itab__927[] = { + /* 0 */ 0, 1205, +}; + +static const uint16_t ud_itab__928[] = { + /* 0 */ 0, 1206, +}; + +static const uint16_t ud_itab__929[] = { + /* 0 */ 0, 1207, +}; + +static const uint16_t ud_itab__930[] = { + /* 0 */ 0, 1208, +}; + +static const uint16_t ud_itab__931[] = { + /* 0 */ 0, 1209, +}; + +static const uint16_t ud_itab__932[] = { + /* 0 */ 0, 1210, +}; + +static const uint16_t ud_itab__933[] = { + /* 0 */ 0, 1211, +}; + +static const uint16_t ud_itab__934[] = { + /* 0 */ 0, 1212, +}; + +static const uint16_t ud_itab__935[] = { + /* 0 */ 0, 1213, +}; + +static const uint16_t ud_itab__936[] = { + /* 0 */ 0, 1214, +}; + +static const uint16_t ud_itab__937[] = { + /* 0 */ 0, 1215, +}; + +static const uint16_t ud_itab__938[] = { + /* 0 */ 0, 1216, +}; + +static const uint16_t ud_itab__939[] = { + /* 0 */ 0, 1217, +}; + +static const uint16_t ud_itab__875[] = { + /* 0 */ GROUP(876), GROUP(877), GROUP(878), GROUP(879), + /* 4 */ GROUP(880), GROUP(881), GROUP(882), GROUP(883), + /* 8 */ GROUP(884), GROUP(885), GROUP(886), GROUP(887), + /* c */ GROUP(888), GROUP(889), GROUP(890), GROUP(891), + /* 10 */ GROUP(892), GROUP(893), GROUP(894), GROUP(895), + /* 14 */ GROUP(896), GROUP(897), GROUP(898), GROUP(899), + /* 18 */ GROUP(900), GROUP(901), GROUP(902), GROUP(903), + /* 1c */ GROUP(904), GROUP(905), GROUP(906), GROUP(907), + /* 20 */ GROUP(908), GROUP(909), GROUP(910), GROUP(911), + /* 24 */ GROUP(912), GROUP(913), GROUP(914), GROUP(915), + /* 28 */ GROUP(916), GROUP(917), GROUP(918), GROUP(919), + /* 2c */ GROUP(920), GROUP(921), GROUP(922), GROUP(923), + /* 30 */ GROUP(924), GROUP(925), GROUP(926), GROUP(927), + /* 34 */ GROUP(928), GROUP(929), GROUP(930), GROUP(931), + /* 38 */ GROUP(932), GROUP(933), GROUP(934), GROUP(935), + /* 3c */ GROUP(936), GROUP(937), GROUP(938), GROUP(939), +}; + +static const uint16_t ud_itab__865[] = { + /* 0 */ GROUP(866), GROUP(875), +}; + +static const uint16_t ud_itab__942[] = { + /* 0 */ 1218, 0, +}; + +static const uint16_t ud_itab__943[] = { + /* 0 */ 1219, 0, +}; + +static const uint16_t ud_itab__944[] = { + /* 0 */ 1220, 0, +}; + +static const uint16_t ud_itab__945[] = { + /* 0 */ 1221, 0, +}; + +static const uint16_t ud_itab__946[] = { + /* 0 */ 1222, 0, +}; + +static const uint16_t ud_itab__947[] = { + /* 0 */ 1223, 0, +}; + +static const uint16_t ud_itab__948[] = { + /* 0 */ 1224, 0, +}; + +static const uint16_t ud_itab__941[] = { + /* 0 */ GROUP(942), GROUP(943), GROUP(944), GROUP(945), + /* 4 */ GROUP(946), 0, GROUP(947), GROUP(948), +}; + +static const uint16_t ud_itab__950[] = { + /* 0 */ 0, 1225, +}; + +static const uint16_t ud_itab__951[] = { + /* 0 */ 0, 1226, +}; + +static const uint16_t ud_itab__952[] = { + /* 0 */ 0, 1227, +}; + +static const uint16_t ud_itab__953[] = { + /* 0 */ 0, 1228, +}; + +static const uint16_t ud_itab__954[] = { + /* 0 */ 0, 1229, +}; + +static const uint16_t ud_itab__955[] = { + /* 0 */ 0, 1230, +}; + +static const uint16_t ud_itab__956[] = { + /* 0 */ 0, 1231, +}; + +static const uint16_t ud_itab__957[] = { + /* 0 */ 0, 1232, +}; + +static const uint16_t ud_itab__958[] = { + /* 0 */ 0, 1233, +}; + +static const uint16_t ud_itab__959[] = { + /* 0 */ 0, 1234, +}; + +static const uint16_t ud_itab__960[] = { + /* 0 */ 0, 1235, +}; + +static const uint16_t ud_itab__961[] = { + /* 0 */ 0, 1236, +}; + +static const uint16_t ud_itab__962[] = { + /* 0 */ 0, 1237, +}; + +static const uint16_t ud_itab__963[] = { + /* 0 */ 0, 1238, +}; + +static const uint16_t ud_itab__964[] = { + /* 0 */ 0, 1239, +}; + +static const uint16_t ud_itab__965[] = { + /* 0 */ 0, 1240, +}; + +static const uint16_t ud_itab__966[] = { + /* 0 */ 0, 1241, +}; + +static const uint16_t ud_itab__967[] = { + /* 0 */ 0, 1242, +}; + +static const uint16_t ud_itab__968[] = { + /* 0 */ 0, 1243, +}; + +static const uint16_t ud_itab__969[] = { + /* 0 */ 0, 1244, +}; + +static const uint16_t ud_itab__970[] = { + /* 0 */ 0, 1245, +}; + +static const uint16_t ud_itab__971[] = { + /* 0 */ 0, 1246, +}; + +static const uint16_t ud_itab__972[] = { + /* 0 */ 0, 1247, +}; + +static const uint16_t ud_itab__973[] = { + /* 0 */ 0, 1248, +}; + +static const uint16_t ud_itab__974[] = { + /* 0 */ 0, 1249, +}; + +static const uint16_t ud_itab__975[] = { + /* 0 */ 0, 1250, +}; + +static const uint16_t ud_itab__976[] = { + /* 0 */ 0, 1251, +}; + +static const uint16_t ud_itab__977[] = { + /* 0 */ 0, 1252, +}; + +static const uint16_t ud_itab__978[] = { + /* 0 */ 0, 1253, +}; + +static const uint16_t ud_itab__979[] = { + /* 0 */ 0, 1254, +}; + +static const uint16_t ud_itab__980[] = { + /* 0 */ 0, 1255, +}; + +static const uint16_t ud_itab__981[] = { + /* 0 */ 0, 1256, +}; + +static const uint16_t ud_itab__982[] = { + /* 0 */ 0, 1257, +}; + +static const uint16_t ud_itab__983[] = { + /* 0 */ 0, 1258, +}; + +static const uint16_t ud_itab__984[] = { + /* 0 */ 0, 1259, +}; + +static const uint16_t ud_itab__985[] = { + /* 0 */ 0, 1260, +}; + +static const uint16_t ud_itab__986[] = { + /* 0 */ 0, 1261, +}; + +static const uint16_t ud_itab__987[] = { + /* 0 */ 0, 1262, +}; + +static const uint16_t ud_itab__988[] = { + /* 0 */ 0, 1263, +}; + +static const uint16_t ud_itab__989[] = { + /* 0 */ 0, 1264, +}; + +static const uint16_t ud_itab__990[] = { + /* 0 */ 0, 1265, +}; + +static const uint16_t ud_itab__991[] = { + /* 0 */ 0, 1266, +}; + +static const uint16_t ud_itab__992[] = { + /* 0 */ 0, 1267, +}; + +static const uint16_t ud_itab__993[] = { + /* 0 */ 0, 1268, +}; + +static const uint16_t ud_itab__994[] = { + /* 0 */ 0, 1269, +}; + +static const uint16_t ud_itab__995[] = { + /* 0 */ 0, 1270, +}; + +static const uint16_t ud_itab__996[] = { + /* 0 */ 0, 1271, +}; + +static const uint16_t ud_itab__997[] = { + /* 0 */ 0, 1272, +}; + +static const uint16_t ud_itab__949[] = { + /* 0 */ GROUP(950), GROUP(951), GROUP(952), GROUP(953), + /* 4 */ GROUP(954), GROUP(955), GROUP(956), GROUP(957), + /* 8 */ GROUP(958), GROUP(959), GROUP(960), GROUP(961), + /* c */ GROUP(962), GROUP(963), GROUP(964), GROUP(965), + /* 10 */ GROUP(966), GROUP(967), GROUP(968), GROUP(969), + /* 14 */ GROUP(970), GROUP(971), GROUP(972), GROUP(973), + /* 18 */ GROUP(974), GROUP(975), GROUP(976), GROUP(977), + /* 1c */ GROUP(978), GROUP(979), GROUP(980), GROUP(981), + /* 20 */ GROUP(982), GROUP(983), GROUP(984), GROUP(985), + /* 24 */ GROUP(986), GROUP(987), GROUP(988), GROUP(989), + /* 28 */ GROUP(990), GROUP(991), GROUP(992), GROUP(993), + /* 2c */ GROUP(994), GROUP(995), GROUP(996), GROUP(997), + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__940[] = { + /* 0 */ GROUP(941), GROUP(949), +}; + +static const uint16_t ud_itab__1000[] = { + /* 0 */ 1273, 0, +}; + +static const uint16_t ud_itab__1001[] = { + /* 0 */ 1274, 0, +}; + +static const uint16_t ud_itab__1002[] = { + /* 0 */ 1275, 0, +}; + +static const uint16_t ud_itab__1003[] = { + /* 0 */ 1276, 0, +}; + +static const uint16_t ud_itab__1004[] = { + /* 0 */ 1277, 0, +}; + +static const uint16_t ud_itab__1005[] = { + /* 0 */ 1278, 0, +}; + +static const uint16_t ud_itab__1006[] = { + /* 0 */ 1279, 0, +}; + +static const uint16_t ud_itab__1007[] = { + /* 0 */ 1280, 0, +}; + +static const uint16_t ud_itab__999[] = { + /* 0 */ GROUP(1000), GROUP(1001), GROUP(1002), GROUP(1003), + /* 4 */ GROUP(1004), GROUP(1005), GROUP(1006), GROUP(1007), +}; + +static const uint16_t ud_itab__1009[] = { + /* 0 */ 0, 1281, +}; + +static const uint16_t ud_itab__1010[] = { + /* 0 */ 0, 1282, +}; + +static const uint16_t ud_itab__1011[] = { + /* 0 */ 0, 1283, +}; + +static const uint16_t ud_itab__1012[] = { + /* 0 */ 0, 1284, +}; + +static const uint16_t ud_itab__1013[] = { + /* 0 */ 0, 1285, +}; + +static const uint16_t ud_itab__1014[] = { + /* 0 */ 0, 1286, +}; + +static const uint16_t ud_itab__1015[] = { + /* 0 */ 0, 1287, +}; + +static const uint16_t ud_itab__1016[] = { + /* 0 */ 0, 1288, +}; + +static const uint16_t ud_itab__1017[] = { + /* 0 */ 0, 1289, +}; + +static const uint16_t ud_itab__1018[] = { + /* 0 */ 0, 1290, +}; + +static const uint16_t ud_itab__1019[] = { + /* 0 */ 0, 1291, +}; + +static const uint16_t ud_itab__1020[] = { + /* 0 */ 0, 1292, +}; + +static const uint16_t ud_itab__1021[] = { + /* 0 */ 0, 1293, +}; + +static const uint16_t ud_itab__1022[] = { + /* 0 */ 0, 1294, +}; + +static const uint16_t ud_itab__1023[] = { + /* 0 */ 0, 1295, +}; + +static const uint16_t ud_itab__1024[] = { + /* 0 */ 0, 1296, +}; + +static const uint16_t ud_itab__1025[] = { + /* 0 */ 0, 1297, +}; + +static const uint16_t ud_itab__1026[] = { + /* 0 */ 0, 1298, +}; + +static const uint16_t ud_itab__1027[] = { + /* 0 */ 0, 1299, +}; + +static const uint16_t ud_itab__1028[] = { + /* 0 */ 0, 1300, +}; + +static const uint16_t ud_itab__1029[] = { + /* 0 */ 0, 1301, +}; + +static const uint16_t ud_itab__1030[] = { + /* 0 */ 0, 1302, +}; + +static const uint16_t ud_itab__1031[] = { + /* 0 */ 0, 1303, +}; + +static const uint16_t ud_itab__1032[] = { + /* 0 */ 0, 1304, +}; + +static const uint16_t ud_itab__1033[] = { + /* 0 */ 0, 1305, +}; + +static const uint16_t ud_itab__1034[] = { + /* 0 */ 0, 1306, +}; + +static const uint16_t ud_itab__1035[] = { + /* 0 */ 0, 1307, +}; + +static const uint16_t ud_itab__1036[] = { + /* 0 */ 0, 1308, +}; + +static const uint16_t ud_itab__1037[] = { + /* 0 */ 0, 1309, +}; + +static const uint16_t ud_itab__1038[] = { + /* 0 */ 0, 1310, +}; + +static const uint16_t ud_itab__1039[] = { + /* 0 */ 0, 1311, +}; + +static const uint16_t ud_itab__1040[] = { + /* 0 */ 0, 1312, +}; + +static const uint16_t ud_itab__1041[] = { + /* 0 */ 0, 1313, +}; + +static const uint16_t ud_itab__1042[] = { + /* 0 */ 0, 1314, +}; + +static const uint16_t ud_itab__1043[] = { + /* 0 */ 0, 1315, +}; + +static const uint16_t ud_itab__1044[] = { + /* 0 */ 0, 1316, +}; + +static const uint16_t ud_itab__1045[] = { + /* 0 */ 0, 1317, +}; + +static const uint16_t ud_itab__1046[] = { + /* 0 */ 0, 1318, +}; + +static const uint16_t ud_itab__1047[] = { + /* 0 */ 0, 1319, +}; + +static const uint16_t ud_itab__1048[] = { + /* 0 */ 0, 1320, +}; + +static const uint16_t ud_itab__1049[] = { + /* 0 */ 0, 1321, +}; + +static const uint16_t ud_itab__1050[] = { + /* 0 */ 0, 1322, +}; + +static const uint16_t ud_itab__1051[] = { + /* 0 */ 0, 1323, +}; + +static const uint16_t ud_itab__1052[] = { + /* 0 */ 0, 1324, +}; + +static const uint16_t ud_itab__1053[] = { + /* 0 */ 0, 1325, +}; + +static const uint16_t ud_itab__1054[] = { + /* 0 */ 0, 1326, +}; + +static const uint16_t ud_itab__1055[] = { + /* 0 */ 0, 1327, +}; + +static const uint16_t ud_itab__1056[] = { + /* 0 */ 0, 1328, +}; + +static const uint16_t ud_itab__1057[] = { + /* 0 */ 0, 1329, +}; + +static const uint16_t ud_itab__1058[] = { + /* 0 */ 0, 1330, +}; + +static const uint16_t ud_itab__1059[] = { + /* 0 */ 0, 1331, +}; + +static const uint16_t ud_itab__1060[] = { + /* 0 */ 0, 1332, +}; + +static const uint16_t ud_itab__1061[] = { + /* 0 */ 0, 1333, +}; + +static const uint16_t ud_itab__1062[] = { + /* 0 */ 0, 1334, +}; + +static const uint16_t ud_itab__1063[] = { + /* 0 */ 0, 1335, +}; + +static const uint16_t ud_itab__1064[] = { + /* 0 */ 0, 1336, +}; + +static const uint16_t ud_itab__1065[] = { + /* 0 */ 0, 1337, +}; + +static const uint16_t ud_itab__1008[] = { + /* 0 */ GROUP(1009), GROUP(1010), GROUP(1011), GROUP(1012), + /* 4 */ GROUP(1013), GROUP(1014), GROUP(1015), GROUP(1016), + /* 8 */ GROUP(1017), GROUP(1018), GROUP(1019), GROUP(1020), + /* c */ GROUP(1021), GROUP(1022), GROUP(1023), GROUP(1024), + /* 10 */ GROUP(1025), GROUP(1026), GROUP(1027), GROUP(1028), + /* 14 */ GROUP(1029), GROUP(1030), GROUP(1031), GROUP(1032), + /* 18 */ 0, GROUP(1033), 0, 0, + /* 1c */ 0, 0, 0, 0, + /* 20 */ GROUP(1034), GROUP(1035), GROUP(1036), GROUP(1037), + /* 24 */ GROUP(1038), GROUP(1039), GROUP(1040), GROUP(1041), + /* 28 */ GROUP(1042), GROUP(1043), GROUP(1044), GROUP(1045), + /* 2c */ GROUP(1046), GROUP(1047), GROUP(1048), GROUP(1049), + /* 30 */ GROUP(1050), GROUP(1051), GROUP(1052), GROUP(1053), + /* 34 */ GROUP(1054), GROUP(1055), GROUP(1056), GROUP(1057), + /* 38 */ GROUP(1058), GROUP(1059), GROUP(1060), GROUP(1061), + /* 3c */ GROUP(1062), GROUP(1063), GROUP(1064), GROUP(1065), +}; + +static const uint16_t ud_itab__998[] = { + /* 0 */ GROUP(999), GROUP(1008), +}; + +static const uint16_t ud_itab__1068[] = { + /* 0 */ 1338, 0, +}; + +static const uint16_t ud_itab__1069[] = { + /* 0 */ 1339, 0, +}; + +static const uint16_t ud_itab__1070[] = { + /* 0 */ 1340, 0, +}; + +static const uint16_t ud_itab__1071[] = { + /* 0 */ 1341, 0, +}; + +static const uint16_t ud_itab__1072[] = { + /* 0 */ 1342, 0, +}; + +static const uint16_t ud_itab__1073[] = { + /* 0 */ 1343, 0, +}; + +static const uint16_t ud_itab__1074[] = { + /* 0 */ 1344, 0, +}; + +static const uint16_t ud_itab__1075[] = { + /* 0 */ 1345, 0, +}; + +static const uint16_t ud_itab__1067[] = { + /* 0 */ GROUP(1068), GROUP(1069), GROUP(1070), GROUP(1071), + /* 4 */ GROUP(1072), GROUP(1073), GROUP(1074), GROUP(1075), +}; + +static const uint16_t ud_itab__1077[] = { + /* 0 */ 0, 1346, +}; + +static const uint16_t ud_itab__1078[] = { + /* 0 */ 0, 1347, +}; + +static const uint16_t ud_itab__1079[] = { + /* 0 */ 0, 1348, +}; + +static const uint16_t ud_itab__1080[] = { + /* 0 */ 0, 1349, +}; + +static const uint16_t ud_itab__1081[] = { + /* 0 */ 0, 1350, +}; + +static const uint16_t ud_itab__1082[] = { + /* 0 */ 0, 1351, +}; + +static const uint16_t ud_itab__1083[] = { + /* 0 */ 0, 1352, +}; + +static const uint16_t ud_itab__1084[] = { + /* 0 */ 0, 1353, +}; + +static const uint16_t ud_itab__1085[] = { + /* 0 */ 0, 1354, +}; + +static const uint16_t ud_itab__1086[] = { + /* 0 */ 0, 1355, +}; + +static const uint16_t ud_itab__1087[] = { + /* 0 */ 0, 1356, +}; + +static const uint16_t ud_itab__1088[] = { + /* 0 */ 0, 1357, +}; + +static const uint16_t ud_itab__1089[] = { + /* 0 */ 0, 1358, +}; + +static const uint16_t ud_itab__1090[] = { + /* 0 */ 0, 1359, +}; + +static const uint16_t ud_itab__1091[] = { + /* 0 */ 0, 1360, +}; + +static const uint16_t ud_itab__1092[] = { + /* 0 */ 0, 1361, +}; + +static const uint16_t ud_itab__1093[] = { + /* 0 */ 0, 1362, +}; + +static const uint16_t ud_itab__1094[] = { + /* 0 */ 0, 1363, +}; + +static const uint16_t ud_itab__1095[] = { + /* 0 */ 0, 1364, +}; + +static const uint16_t ud_itab__1096[] = { + /* 0 */ 0, 1365, +}; + +static const uint16_t ud_itab__1097[] = { + /* 0 */ 0, 1366, +}; + +static const uint16_t ud_itab__1098[] = { + /* 0 */ 0, 1367, +}; + +static const uint16_t ud_itab__1099[] = { + /* 0 */ 0, 1368, +}; + +static const uint16_t ud_itab__1100[] = { + /* 0 */ 0, 1369, +}; + +static const uint16_t ud_itab__1101[] = { + /* 0 */ 0, 1370, +}; + +static const uint16_t ud_itab__1102[] = { + /* 0 */ 0, 1371, +}; + +static const uint16_t ud_itab__1103[] = { + /* 0 */ 0, 1372, +}; + +static const uint16_t ud_itab__1104[] = { + /* 0 */ 0, 1373, +}; + +static const uint16_t ud_itab__1105[] = { + /* 0 */ 0, 1374, +}; + +static const uint16_t ud_itab__1106[] = { + /* 0 */ 0, 1375, +}; + +static const uint16_t ud_itab__1107[] = { + /* 0 */ 0, 1376, +}; + +static const uint16_t ud_itab__1108[] = { + /* 0 */ 0, 1377, +}; + +static const uint16_t ud_itab__1109[] = { + /* 0 */ 0, 1378, +}; + +static const uint16_t ud_itab__1110[] = { + /* 0 */ 0, 1379, +}; + +static const uint16_t ud_itab__1111[] = { + /* 0 */ 0, 1380, +}; + +static const uint16_t ud_itab__1112[] = { + /* 0 */ 0, 1381, +}; + +static const uint16_t ud_itab__1113[] = { + /* 0 */ 0, 1382, +}; + +static const uint16_t ud_itab__1114[] = { + /* 0 */ 0, 1383, +}; + +static const uint16_t ud_itab__1115[] = { + /* 0 */ 0, 1384, +}; + +static const uint16_t ud_itab__1116[] = { + /* 0 */ 0, 1385, +}; + +static const uint16_t ud_itab__1117[] = { + /* 0 */ 0, 1386, +}; + +static const uint16_t ud_itab__1118[] = { + /* 0 */ 0, 1387, +}; + +static const uint16_t ud_itab__1119[] = { + /* 0 */ 0, 1388, +}; + +static const uint16_t ud_itab__1120[] = { + /* 0 */ 0, 1389, +}; + +static const uint16_t ud_itab__1121[] = { + /* 0 */ 0, 1390, +}; + +static const uint16_t ud_itab__1122[] = { + /* 0 */ 0, 1391, +}; + +static const uint16_t ud_itab__1123[] = { + /* 0 */ 0, 1392, +}; + +static const uint16_t ud_itab__1124[] = { + /* 0 */ 0, 1393, +}; + +static const uint16_t ud_itab__1125[] = { + /* 0 */ 0, 1394, +}; + +static const uint16_t ud_itab__1076[] = { + /* 0 */ GROUP(1077), GROUP(1078), GROUP(1079), GROUP(1080), + /* 4 */ GROUP(1081), GROUP(1082), GROUP(1083), GROUP(1084), + /* 8 */ GROUP(1085), GROUP(1086), GROUP(1087), GROUP(1088), + /* c */ GROUP(1089), GROUP(1090), GROUP(1091), GROUP(1092), + /* 10 */ GROUP(1093), GROUP(1094), GROUP(1095), GROUP(1096), + /* 14 */ GROUP(1097), GROUP(1098), GROUP(1099), GROUP(1100), + /* 18 */ GROUP(1101), GROUP(1102), GROUP(1103), GROUP(1104), + /* 1c */ GROUP(1105), GROUP(1106), GROUP(1107), GROUP(1108), + /* 20 */ GROUP(1109), 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(1110), GROUP(1111), GROUP(1112), GROUP(1113), + /* 2c */ GROUP(1114), GROUP(1115), GROUP(1116), GROUP(1117), + /* 30 */ GROUP(1118), GROUP(1119), GROUP(1120), GROUP(1121), + /* 34 */ GROUP(1122), GROUP(1123), GROUP(1124), GROUP(1125), + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__1066[] = { + /* 0 */ GROUP(1067), GROUP(1076), +}; + +static const uint16_t ud_itab__1126[] = { + /* 0 */ 1398, 1399, 1400, +}; + +static const uint16_t ud_itab__1127[] = { + /* 0 */ 1407, 0, +}; + +static const uint16_t ud_itab__1128[] = { + /* 0 */ 1419, 1420, 1421, 1422, + /* 4 */ 1423, 1424, 1425, 1426, +}; + +static const uint16_t ud_itab__1129[] = { + /* 0 */ 1427, 1428, 1429, 1430, + /* 4 */ 1431, 1432, 1433, 1434, +}; + +static const uint16_t ud_itab__1130[] = { + /* 0 */ 1441, 1442, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__1132[] = { + /* 0 */ 1445, 1446, +}; + +static const uint16_t ud_itab__1131[] = { + /* 0 */ 1443, 1444, GROUP(1132), 1447, + /* 4 */ 1448, 1449, 1450, 0, +}; + +const uint16_t ud_itab__0[] = { + /* 0 */ 1, 2, 3, 4, + /* 4 */ 5, 6, GROUP(1), GROUP(2), + /* 8 */ 9, 10, 11, 12, + /* c */ 13, 14, GROUP(3), GROUP(4), + /* 10 */ 628, 629, 630, 631, + /* 14 */ 632, 633, GROUP(563), GROUP(564), + /* 18 */ 636, 637, 638, 639, + /* 1c */ 640, 641, GROUP(565), GROUP(566), + /* 20 */ 644, 645, 646, 647, + /* 24 */ 648, 649, 0, GROUP(567), + /* 28 */ 651, 652, 653, 654, + /* 2c */ 655, 656, 0, GROUP(568), + /* 30 */ 658, 659, 660, 661, + /* 34 */ 662, 663, 0, GROUP(569), + /* 38 */ 665, 666, 667, 668, + /* 3c */ 669, 670, 0, GROUP(570), + /* 40 */ 672, 673, 674, 675, + /* 44 */ 676, 677, 678, 679, + /* 48 */ 680, 681, 682, 683, + /* 4c */ 684, 685, 686, 687, + /* 50 */ 688, 689, 690, 691, + /* 54 */ 692, 693, 694, 695, + /* 58 */ 696, 697, 698, 699, + /* 5c */ 700, 701, 702, 703, + /* 60 */ GROUP(571), GROUP(574), GROUP(577), GROUP(578), + /* 64 */ 0, 0, 0, 0, + /* 68 */ 711, 712, 713, 714, + /* 6c */ 715, GROUP(579), 718, GROUP(580), + /* 70 */ 721, 722, 723, 724, + /* 74 */ 725, 726, 727, 728, + /* 78 */ 729, 730, 731, 732, + /* 7c */ 733, 734, 735, 736, + /* 80 */ GROUP(581), GROUP(582), GROUP(583), GROUP(592), + /* 84 */ 769, 770, 771, 772, + /* 88 */ 773, 774, 775, 776, + /* 8c */ 777, 778, 779, GROUP(593), + /* 90 */ 781, 782, 783, 784, + /* 94 */ 785, 786, 787, 788, + /* 98 */ GROUP(594), GROUP(595), GROUP(596), 796, + /* 9c */ GROUP(597), GROUP(601), 806, 807, + /* a0 */ 808, 809, 810, 811, + /* a4 */ 812, GROUP(605), 816, GROUP(606), + /* a8 */ 820, 821, 822, GROUP(607), + /* ac */ 826, GROUP(608), 830, GROUP(609), + /* b0 */ 834, 835, 836, 837, + /* b4 */ 838, 839, 840, 841, + /* b8 */ 842, 843, 844, 845, + /* bc */ 846, 847, 848, 849, + /* c0 */ GROUP(610), GROUP(611), 866, 867, + /* c4 */ GROUP(612), GROUP(613), GROUP(614), GROUP(615), + /* c8 */ 872, 873, 874, 875, + /* cc */ 876, 877, GROUP(616), GROUP(617), + /* d0 */ GROUP(618), GROUP(619), GROUP(620), GROUP(621), + /* d4 */ GROUP(622), GROUP(623), GROUP(624), 917, + /* d8 */ GROUP(625), GROUP(700), GROUP(762), GROUP(806), + /* dc */ GROUP(865), GROUP(940), GROUP(998), GROUP(1066), + /* e0 */ 1395, 1396, 1397, GROUP(1126), + /* e4 */ 1401, 1402, 1403, 1404, + /* e8 */ 1405, 1406, GROUP(1127), 1408, + /* ec */ 1409, 1410, 1411, 1412, + /* f0 */ 1413, 1414, 1415, 1416, + /* f4 */ 1417, 1418, GROUP(1128), GROUP(1129), + /* f8 */ 1435, 1436, 1437, 1438, + /* fc */ 1439, 1440, GROUP(1130), GROUP(1131), +}; + + +struct ud_lookup_table_list_entry ud_lookup_table_list[] = { + /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" }, + /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" }, + /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" }, + /* 003 */ { ud_itab__3, UD_TAB__OPC_MODE, "/m" }, + /* 004 */ { ud_itab__4, UD_TAB__OPC_TABLE, "0f" }, + /* 005 */ { ud_itab__5, UD_TAB__OPC_REG, "/reg" }, + /* 006 */ { ud_itab__6, UD_TAB__OPC_SSE, "/sse" }, + /* 007 */ { ud_itab__7, UD_TAB__OPC_SSE, "/sse" }, + /* 008 */ { ud_itab__8, UD_TAB__OPC_SSE, "/sse" }, + /* 009 */ { ud_itab__9, UD_TAB__OPC_SSE, "/sse" }, + /* 010 */ { ud_itab__10, UD_TAB__OPC_SSE, "/sse" }, + /* 011 */ { ud_itab__11, UD_TAB__OPC_SSE, "/sse" }, + /* 012 */ { ud_itab__12, UD_TAB__OPC_MOD, "/mod" }, + /* 013 */ { ud_itab__13, UD_TAB__OPC_REG, "/reg" }, + /* 014 */ { ud_itab__14, UD_TAB__OPC_SSE, "/sse" }, + /* 015 */ { ud_itab__15, UD_TAB__OPC_MOD, "/mod" }, + /* 016 */ { ud_itab__16, UD_TAB__OPC_SSE, "/sse" }, + /* 017 */ { ud_itab__17, UD_TAB__OPC_MOD, "/mod" }, + /* 018 */ { ud_itab__18, UD_TAB__OPC_SSE, "/sse" }, + /* 019 */ { ud_itab__19, UD_TAB__OPC_MOD, "/mod" }, + /* 020 */ { ud_itab__20, UD_TAB__OPC_SSE, "/sse" }, + /* 021 */ { ud_itab__21, UD_TAB__OPC_MOD, "/mod" }, + /* 022 */ { ud_itab__22, UD_TAB__OPC_SSE, "/sse" }, + /* 023 */ { ud_itab__23, UD_TAB__OPC_MOD, "/mod" }, + /* 024 */ { ud_itab__24, UD_TAB__OPC_SSE, "/sse" }, + /* 025 */ { ud_itab__25, UD_TAB__OPC_MOD, "/mod" }, + /* 026 */ { ud_itab__26, UD_TAB__OPC_SSE, "/sse" }, + /* 027 */ { ud_itab__27, UD_TAB__OPC_MOD, "/mod" }, + /* 028 */ { ud_itab__28, UD_TAB__OPC_REG, "/reg" }, + /* 029 */ { ud_itab__29, UD_TAB__OPC_RM, "/rm" }, + /* 030 */ { ud_itab__30, UD_TAB__OPC_SSE, "/sse" }, + /* 031 */ { ud_itab__31, UD_TAB__OPC_MOD, "/mod" }, + /* 032 */ { ud_itab__32, UD_TAB__OPC_VENDOR, "intel" }, + /* 033 */ { ud_itab__33, UD_TAB__OPC_SSE, "/sse" }, + /* 034 */ { ud_itab__34, UD_TAB__OPC_MOD, "/mod" }, + /* 035 */ { ud_itab__35, UD_TAB__OPC_VENDOR, "intel" }, + /* 036 */ { ud_itab__36, UD_TAB__OPC_SSE, "/sse" }, + /* 037 */ { ud_itab__37, UD_TAB__OPC_MOD, "/mod" }, + /* 038 */ { ud_itab__38, UD_TAB__OPC_VENDOR, "intel" }, + /* 039 */ { ud_itab__39, UD_TAB__OPC_SSE, "/sse" }, + /* 040 */ { ud_itab__40, UD_TAB__OPC_MOD, "/mod" }, + /* 041 */ { ud_itab__41, UD_TAB__OPC_VENDOR, "intel" }, + /* 042 */ { ud_itab__42, UD_TAB__OPC_RM, "/rm" }, + /* 043 */ { ud_itab__43, UD_TAB__OPC_SSE, "/sse" }, + /* 044 */ { ud_itab__44, UD_TAB__OPC_MOD, "/mod" }, + /* 045 */ { ud_itab__45, UD_TAB__OPC_SSE, "/sse" }, + /* 046 */ { ud_itab__46, UD_TAB__OPC_MOD, "/mod" }, + /* 047 */ { ud_itab__47, UD_TAB__OPC_RM, "/rm" }, + /* 048 */ { ud_itab__48, UD_TAB__OPC_SSE, "/sse" }, + /* 049 */ { ud_itab__49, UD_TAB__OPC_MOD, "/mod" }, + /* 050 */ { ud_itab__50, UD_TAB__OPC_SSE, "/sse" }, + /* 051 */ { ud_itab__51, UD_TAB__OPC_MOD, "/mod" }, + /* 052 */ { ud_itab__52, UD_TAB__OPC_RM, "/rm" }, + /* 053 */ { ud_itab__53, UD_TAB__OPC_SSE, "/sse" }, + /* 054 */ { ud_itab__54, UD_TAB__OPC_MOD, "/mod" }, + /* 055 */ { ud_itab__55, UD_TAB__OPC_VENDOR, "amd" }, + /* 056 */ { ud_itab__56, UD_TAB__OPC_SSE, "/sse" }, + /* 057 */ { ud_itab__57, UD_TAB__OPC_MOD, "/mod" }, + /* 058 */ { ud_itab__58, UD_TAB__OPC_VENDOR, "amd" }, + /* 059 */ { ud_itab__59, UD_TAB__OPC_SSE, "/sse" }, + /* 060 */ { ud_itab__60, UD_TAB__OPC_MOD, "/mod" }, + /* 061 */ { ud_itab__61, UD_TAB__OPC_VENDOR, "amd" }, + /* 062 */ { ud_itab__62, UD_TAB__OPC_SSE, "/sse" }, + /* 063 */ { ud_itab__63, UD_TAB__OPC_MOD, "/mod" }, + /* 064 */ { ud_itab__64, UD_TAB__OPC_VENDOR, "amd" }, + /* 065 */ { ud_itab__65, UD_TAB__OPC_SSE, "/sse" }, + /* 066 */ { ud_itab__66, UD_TAB__OPC_MOD, "/mod" }, + /* 067 */ { ud_itab__67, UD_TAB__OPC_VENDOR, "amd" }, + /* 068 */ { ud_itab__68, UD_TAB__OPC_SSE, "/sse" }, + /* 069 */ { ud_itab__69, UD_TAB__OPC_MOD, "/mod" }, + /* 070 */ { ud_itab__70, UD_TAB__OPC_VENDOR, "amd" }, + /* 071 */ { ud_itab__71, UD_TAB__OPC_SSE, "/sse" }, + /* 072 */ { ud_itab__72, UD_TAB__OPC_MOD, "/mod" }, + /* 073 */ { ud_itab__73, UD_TAB__OPC_VENDOR, "amd" }, + /* 074 */ { ud_itab__74, UD_TAB__OPC_SSE, "/sse" }, + /* 075 */ { ud_itab__75, UD_TAB__OPC_MOD, "/mod" }, + /* 076 */ { ud_itab__76, UD_TAB__OPC_VENDOR, "amd" }, + /* 077 */ { ud_itab__77, UD_TAB__OPC_SSE, "/sse" }, + /* 078 */ { ud_itab__78, UD_TAB__OPC_MOD, "/mod" }, + /* 079 */ { ud_itab__79, UD_TAB__OPC_SSE, "/sse" }, + /* 080 */ { ud_itab__80, UD_TAB__OPC_MOD, "/mod" }, + /* 081 */ { ud_itab__81, UD_TAB__OPC_RM, "/rm" }, + /* 082 */ { ud_itab__82, UD_TAB__OPC_SSE, "/sse" }, + /* 083 */ { ud_itab__83, UD_TAB__OPC_MOD, "/mod" }, + /* 084 */ { ud_itab__84, UD_TAB__OPC_SSE, "/sse" }, + /* 085 */ { ud_itab__85, UD_TAB__OPC_MOD, "/mod" }, + /* 086 */ { ud_itab__86, UD_TAB__OPC_VENDOR, "amd" }, + /* 087 */ { ud_itab__87, UD_TAB__OPC_SSE, "/sse" }, + /* 088 */ { ud_itab__88, UD_TAB__OPC_SSE, "/sse" }, + /* 089 */ { ud_itab__89, UD_TAB__OPC_SSE, "/sse" }, + /* 090 */ { ud_itab__90, UD_TAB__OPC_SSE, "/sse" }, + /* 091 */ { ud_itab__91, UD_TAB__OPC_SSE, "/sse" }, + /* 092 */ { ud_itab__92, UD_TAB__OPC_SSE, "/sse" }, + /* 093 */ { ud_itab__93, UD_TAB__OPC_SSE, "/sse" }, + /* 094 */ { ud_itab__94, UD_TAB__OPC_SSE, "/sse" }, + /* 095 */ { ud_itab__95, UD_TAB__OPC_REG, "/reg" }, + /* 096 */ { ud_itab__96, UD_TAB__OPC_SSE, "/sse" }, + /* 097 */ { ud_itab__97, UD_TAB__OPC_SSE, "/sse" }, + /* 098 */ { ud_itab__98, UD_TAB__OPC_SSE, "/sse" }, + /* 099 */ { ud_itab__99, UD_TAB__OPC_SSE, "/sse" }, + /* 100 */ { ud_itab__100, UD_TAB__OPC_SSE, "/sse" }, + /* 101 */ { ud_itab__101, UD_TAB__OPC_SSE, "/sse" }, + /* 102 */ { ud_itab__102, UD_TAB__OPC_SSE, "/sse" }, + /* 103 */ { ud_itab__103, UD_TAB__OPC_SSE, "/sse" }, + /* 104 */ { ud_itab__104, UD_TAB__OPC_SSE, "/sse" }, + /* 105 */ { ud_itab__105, UD_TAB__OPC_3DNOW, "/3dnow" }, + /* 106 */ { ud_itab__106, UD_TAB__OPC_SSE, "/sse" }, + /* 107 */ { ud_itab__107, UD_TAB__OPC_SSE, "/sse" }, + /* 108 */ { ud_itab__108, UD_TAB__OPC_MOD, "/mod" }, + /* 109 */ { ud_itab__109, UD_TAB__OPC_SSE, "/sse" }, + /* 110 */ { ud_itab__110, UD_TAB__OPC_MOD, "/mod" }, + /* 111 */ { ud_itab__111, UD_TAB__OPC_MOD, "/mod" }, + /* 112 */ { ud_itab__112, UD_TAB__OPC_MOD, "/mod" }, + /* 113 */ { ud_itab__113, UD_TAB__OPC_MOD, "/mod" }, + /* 114 */ { ud_itab__114, UD_TAB__OPC_SSE, "/sse" }, + /* 115 */ { ud_itab__115, UD_TAB__OPC_MOD, "/mod" }, + /* 116 */ { ud_itab__116, UD_TAB__OPC_MOD, "/mod" }, + /* 117 */ { ud_itab__117, UD_TAB__OPC_MOD, "/mod" }, + /* 118 */ { ud_itab__118, UD_TAB__OPC_SSE, "/sse" }, + /* 119 */ { ud_itab__119, UD_TAB__OPC_SSE, "/sse" }, + /* 120 */ { ud_itab__120, UD_TAB__OPC_SSE, "/sse" }, + /* 121 */ { ud_itab__121, UD_TAB__OPC_MOD, "/mod" }, + /* 122 */ { ud_itab__122, UD_TAB__OPC_SSE, "/sse" }, + /* 123 */ { ud_itab__123, UD_TAB__OPC_MOD, "/mod" }, + /* 124 */ { ud_itab__124, UD_TAB__OPC_MOD, "/mod" }, + /* 125 */ { ud_itab__125, UD_TAB__OPC_MOD, "/mod" }, + /* 126 */ { ud_itab__126, UD_TAB__OPC_SSE, "/sse" }, + /* 127 */ { ud_itab__127, UD_TAB__OPC_MOD, "/mod" }, + /* 128 */ { ud_itab__128, UD_TAB__OPC_MOD, "/mod" }, + /* 129 */ { ud_itab__129, UD_TAB__OPC_SSE, "/sse" }, + /* 130 */ { ud_itab__130, UD_TAB__OPC_REG, "/reg" }, + /* 131 */ { ud_itab__131, UD_TAB__OPC_SSE, "/sse" }, + /* 132 */ { ud_itab__132, UD_TAB__OPC_SSE, "/sse" }, + /* 133 */ { ud_itab__133, UD_TAB__OPC_SSE, "/sse" }, + /* 134 */ { ud_itab__134, UD_TAB__OPC_SSE, "/sse" }, + /* 135 */ { ud_itab__135, UD_TAB__OPC_SSE, "/sse" }, + /* 136 */ { ud_itab__136, UD_TAB__OPC_SSE, "/sse" }, + /* 137 */ { ud_itab__137, UD_TAB__OPC_SSE, "/sse" }, + /* 138 */ { ud_itab__138, UD_TAB__OPC_SSE, "/sse" }, + /* 139 */ { ud_itab__139, UD_TAB__OPC_SSE, "/sse" }, + /* 140 */ { ud_itab__140, UD_TAB__OPC_SSE, "/sse" }, + /* 141 */ { ud_itab__141, UD_TAB__OPC_SSE, "/sse" }, + /* 142 */ { ud_itab__142, UD_TAB__OPC_SSE, "/sse" }, + /* 143 */ { ud_itab__143, UD_TAB__OPC_SSE, "/sse" }, + /* 144 */ { ud_itab__144, UD_TAB__OPC_SSE, "/sse" }, + /* 145 */ { ud_itab__145, UD_TAB__OPC_SSE, "/sse" }, + /* 146 */ { ud_itab__146, UD_TAB__OPC_SSE, "/sse" }, + /* 147 */ { ud_itab__147, UD_TAB__OPC_SSE, "/sse" }, + /* 148 */ { ud_itab__148, UD_TAB__OPC_SSE, "/sse" }, + /* 149 */ { ud_itab__149, UD_TAB__OPC_SSE, "/sse" }, + /* 150 */ { ud_itab__150, UD_TAB__OPC_SSE, "/sse" }, + /* 151 */ { ud_itab__151, UD_TAB__OPC_SSE, "/sse" }, + /* 152 */ { ud_itab__152, UD_TAB__OPC_SSE, "/sse" }, + /* 153 */ { ud_itab__153, UD_TAB__OPC_SSE, "/sse" }, + /* 154 */ { ud_itab__154, UD_TAB__OPC_SSE, "/sse" }, + /* 155 */ { ud_itab__155, UD_TAB__OPC_SSE, "/sse" }, + /* 156 */ { ud_itab__156, UD_TAB__OPC_SSE, "/sse" }, + /* 157 */ { ud_itab__157, UD_TAB__OPC_SSE, "/sse" }, + /* 158 */ { ud_itab__158, UD_TAB__OPC_SSE, "/sse" }, + /* 159 */ { ud_itab__159, UD_TAB__OPC_MODE, "/m" }, + /* 160 */ { ud_itab__160, UD_TAB__OPC_VENDOR, "intel" }, + /* 161 */ { ud_itab__161, UD_TAB__OPC_SSE, "/sse" }, + /* 162 */ { ud_itab__162, UD_TAB__OPC_MODE, "/m" }, + /* 163 */ { ud_itab__163, UD_TAB__OPC_VENDOR, "intel" }, + /* 164 */ { ud_itab__164, UD_TAB__OPC_SSE, "/sse" }, + /* 165 */ { ud_itab__165, UD_TAB__OPC_TABLE, "38" }, + /* 166 */ { ud_itab__166, UD_TAB__OPC_SSE, "/sse" }, + /* 167 */ { ud_itab__167, UD_TAB__OPC_SSE, "/sse" }, + /* 168 */ { ud_itab__168, UD_TAB__OPC_SSE, "/sse" }, + /* 169 */ { ud_itab__169, UD_TAB__OPC_SSE, "/sse" }, + /* 170 */ { ud_itab__170, UD_TAB__OPC_SSE, "/sse" }, + /* 171 */ { ud_itab__171, UD_TAB__OPC_SSE, "/sse" }, + /* 172 */ { ud_itab__172, UD_TAB__OPC_SSE, "/sse" }, + /* 173 */ { ud_itab__173, UD_TAB__OPC_SSE, "/sse" }, + /* 174 */ { ud_itab__174, UD_TAB__OPC_SSE, "/sse" }, + /* 175 */ { ud_itab__175, UD_TAB__OPC_SSE, "/sse" }, + /* 176 */ { ud_itab__176, UD_TAB__OPC_SSE, "/sse" }, + /* 177 */ { ud_itab__177, UD_TAB__OPC_SSE, "/sse" }, + /* 178 */ { ud_itab__178, UD_TAB__OPC_SSE, "/sse" }, + /* 179 */ { ud_itab__179, UD_TAB__OPC_SSE, "/sse" }, + /* 180 */ { ud_itab__180, UD_TAB__OPC_SSE, "/sse" }, + /* 181 */ { ud_itab__181, UD_TAB__OPC_SSE, "/sse" }, + /* 182 */ { ud_itab__182, UD_TAB__OPC_SSE, "/sse" }, + /* 183 */ { ud_itab__183, UD_TAB__OPC_SSE, "/sse" }, + /* 184 */ { ud_itab__184, UD_TAB__OPC_SSE, "/sse" }, + /* 185 */ { ud_itab__185, UD_TAB__OPC_SSE, "/sse" }, + /* 186 */ { ud_itab__186, UD_TAB__OPC_SSE, "/sse" }, + /* 187 */ { ud_itab__187, UD_TAB__OPC_SSE, "/sse" }, + /* 188 */ { ud_itab__188, UD_TAB__OPC_SSE, "/sse" }, + /* 189 */ { ud_itab__189, UD_TAB__OPC_SSE, "/sse" }, + /* 190 */ { ud_itab__190, UD_TAB__OPC_SSE, "/sse" }, + /* 191 */ { ud_itab__191, UD_TAB__OPC_SSE, "/sse" }, + /* 192 */ { ud_itab__192, UD_TAB__OPC_SSE, "/sse" }, + /* 193 */ { ud_itab__193, UD_TAB__OPC_SSE, "/sse" }, + /* 194 */ { ud_itab__194, UD_TAB__OPC_SSE, "/sse" }, + /* 195 */ { ud_itab__195, UD_TAB__OPC_SSE, "/sse" }, + /* 196 */ { ud_itab__196, UD_TAB__OPC_SSE, "/sse" }, + /* 197 */ { ud_itab__197, UD_TAB__OPC_SSE, "/sse" }, + /* 198 */ { ud_itab__198, UD_TAB__OPC_SSE, "/sse" }, + /* 199 */ { ud_itab__199, UD_TAB__OPC_SSE, "/sse" }, + /* 200 */ { ud_itab__200, UD_TAB__OPC_SSE, "/sse" }, + /* 201 */ { ud_itab__201, UD_TAB__OPC_SSE, "/sse" }, + /* 202 */ { ud_itab__202, UD_TAB__OPC_SSE, "/sse" }, + /* 203 */ { ud_itab__203, UD_TAB__OPC_SSE, "/sse" }, + /* 204 */ { ud_itab__204, UD_TAB__OPC_SSE, "/sse" }, + /* 205 */ { ud_itab__205, UD_TAB__OPC_SSE, "/sse" }, + /* 206 */ { ud_itab__206, UD_TAB__OPC_SSE, "/sse" }, + /* 207 */ { ud_itab__207, UD_TAB__OPC_SSE, "/sse" }, + /* 208 */ { ud_itab__208, UD_TAB__OPC_SSE, "/sse" }, + /* 209 */ { ud_itab__209, UD_TAB__OPC_SSE, "/sse" }, + /* 210 */ { ud_itab__210, UD_TAB__OPC_SSE, "/sse" }, + /* 211 */ { ud_itab__211, UD_TAB__OPC_SSE, "/sse" }, + /* 212 */ { ud_itab__212, UD_TAB__OPC_SSE, "/sse" }, + /* 213 */ { ud_itab__213, UD_TAB__OPC_MODE, "/m" }, + /* 214 */ { ud_itab__214, UD_TAB__OPC_VENDOR, "intel" }, + /* 215 */ { ud_itab__215, UD_TAB__OPC_SSE, "/sse" }, + /* 216 */ { ud_itab__216, UD_TAB__OPC_MODE, "/m" }, + /* 217 */ { ud_itab__217, UD_TAB__OPC_VENDOR, "intel" }, + /* 218 */ { ud_itab__218, UD_TAB__OPC_SSE, "/sse" }, + /* 219 */ { ud_itab__219, UD_TAB__OPC_SSE, "/sse" }, + /* 220 */ { ud_itab__220, UD_TAB__OPC_SSE, "/sse" }, + /* 221 */ { ud_itab__221, UD_TAB__OPC_SSE, "/sse" }, + /* 222 */ { ud_itab__222, UD_TAB__OPC_SSE, "/sse" }, + /* 223 */ { ud_itab__223, UD_TAB__OPC_SSE, "/sse" }, + /* 224 */ { ud_itab__224, UD_TAB__OPC_SSE, "/sse" }, + /* 225 */ { ud_itab__225, UD_TAB__OPC_TABLE, "3a" }, + /* 226 */ { ud_itab__226, UD_TAB__OPC_SSE, "/sse" }, + /* 227 */ { ud_itab__227, UD_TAB__OPC_SSE, "/sse" }, + /* 228 */ { ud_itab__228, UD_TAB__OPC_SSE, "/sse" }, + /* 229 */ { ud_itab__229, UD_TAB__OPC_SSE, "/sse" }, + /* 230 */ { ud_itab__230, UD_TAB__OPC_SSE, "/sse" }, + /* 231 */ { ud_itab__231, UD_TAB__OPC_SSE, "/sse" }, + /* 232 */ { ud_itab__232, UD_TAB__OPC_SSE, "/sse" }, + /* 233 */ { ud_itab__233, UD_TAB__OPC_SSE, "/sse" }, + /* 234 */ { ud_itab__234, UD_TAB__OPC_SSE, "/sse" }, + /* 235 */ { ud_itab__235, UD_TAB__OPC_SSE, "/sse" }, + /* 236 */ { ud_itab__236, UD_TAB__OPC_SSE, "/sse" }, + /* 237 */ { ud_itab__237, UD_TAB__OPC_OSIZE, "/o" }, + /* 238 */ { ud_itab__238, UD_TAB__OPC_SSE, "/sse" }, + /* 239 */ { ud_itab__239, UD_TAB__OPC_SSE, "/sse" }, + /* 240 */ { ud_itab__240, UD_TAB__OPC_SSE, "/sse" }, + /* 241 */ { ud_itab__241, UD_TAB__OPC_SSE, "/sse" }, + /* 242 */ { ud_itab__242, UD_TAB__OPC_OSIZE, "/o" }, + /* 243 */ { ud_itab__243, UD_TAB__OPC_SSE, "/sse" }, + /* 244 */ { ud_itab__244, UD_TAB__OPC_SSE, "/sse" }, + /* 245 */ { ud_itab__245, UD_TAB__OPC_SSE, "/sse" }, + /* 246 */ { ud_itab__246, UD_TAB__OPC_SSE, "/sse" }, + /* 247 */ { ud_itab__247, UD_TAB__OPC_SSE, "/sse" }, + /* 248 */ { ud_itab__248, UD_TAB__OPC_SSE, "/sse" }, + /* 249 */ { ud_itab__249, UD_TAB__OPC_SSE, "/sse" }, + /* 250 */ { ud_itab__250, UD_TAB__OPC_SSE, "/sse" }, + /* 251 */ { ud_itab__251, UD_TAB__OPC_SSE, "/sse" }, + /* 252 */ { ud_itab__252, UD_TAB__OPC_SSE, "/sse" }, + /* 253 */ { ud_itab__253, UD_TAB__OPC_SSE, "/sse" }, + /* 254 */ { ud_itab__254, UD_TAB__OPC_SSE, "/sse" }, + /* 255 */ { ud_itab__255, UD_TAB__OPC_SSE, "/sse" }, + /* 256 */ { ud_itab__256, UD_TAB__OPC_SSE, "/sse" }, + /* 257 */ { ud_itab__257, UD_TAB__OPC_SSE, "/sse" }, + /* 258 */ { ud_itab__258, UD_TAB__OPC_SSE, "/sse" }, + /* 259 */ { ud_itab__259, UD_TAB__OPC_SSE, "/sse" }, + /* 260 */ { ud_itab__260, UD_TAB__OPC_SSE, "/sse" }, + /* 261 */ { ud_itab__261, UD_TAB__OPC_SSE, "/sse" }, + /* 262 */ { ud_itab__262, UD_TAB__OPC_SSE, "/sse" }, + /* 263 */ { ud_itab__263, UD_TAB__OPC_SSE, "/sse" }, + /* 264 */ { ud_itab__264, UD_TAB__OPC_SSE, "/sse" }, + /* 265 */ { ud_itab__265, UD_TAB__OPC_SSE, "/sse" }, + /* 266 */ { ud_itab__266, UD_TAB__OPC_SSE, "/sse" }, + /* 267 */ { ud_itab__267, UD_TAB__OPC_SSE, "/sse" }, + /* 268 */ { ud_itab__268, UD_TAB__OPC_SSE, "/sse" }, + /* 269 */ { ud_itab__269, UD_TAB__OPC_SSE, "/sse" }, + /* 270 */ { ud_itab__270, UD_TAB__OPC_SSE, "/sse" }, + /* 271 */ { ud_itab__271, UD_TAB__OPC_SSE, "/sse" }, + /* 272 */ { ud_itab__272, UD_TAB__OPC_SSE, "/sse" }, + /* 273 */ { ud_itab__273, UD_TAB__OPC_SSE, "/sse" }, + /* 274 */ { ud_itab__274, UD_TAB__OPC_SSE, "/sse" }, + /* 275 */ { ud_itab__275, UD_TAB__OPC_SSE, "/sse" }, + /* 276 */ { ud_itab__276, UD_TAB__OPC_SSE, "/sse" }, + /* 277 */ { ud_itab__277, UD_TAB__OPC_SSE, "/sse" }, + /* 278 */ { ud_itab__278, UD_TAB__OPC_SSE, "/sse" }, + /* 279 */ { ud_itab__279, UD_TAB__OPC_SSE, "/sse" }, + /* 280 */ { ud_itab__280, UD_TAB__OPC_SSE, "/sse" }, + /* 281 */ { ud_itab__281, UD_TAB__OPC_SSE, "/sse" }, + /* 282 */ { ud_itab__282, UD_TAB__OPC_SSE, "/sse" }, + /* 283 */ { ud_itab__283, UD_TAB__OPC_SSE, "/sse" }, + /* 284 */ { ud_itab__284, UD_TAB__OPC_SSE, "/sse" }, + /* 285 */ { ud_itab__285, UD_TAB__OPC_SSE, "/sse" }, + /* 286 */ { ud_itab__286, UD_TAB__OPC_SSE, "/sse" }, + /* 287 */ { ud_itab__287, UD_TAB__OPC_SSE, "/sse" }, + /* 288 */ { ud_itab__288, UD_TAB__OPC_SSE, "/sse" }, + /* 289 */ { ud_itab__289, UD_TAB__OPC_SSE, "/sse" }, + /* 290 */ { ud_itab__290, UD_TAB__OPC_SSE, "/sse" }, + /* 291 */ { ud_itab__291, UD_TAB__OPC_SSE, "/sse" }, + /* 292 */ { ud_itab__292, UD_TAB__OPC_SSE, "/sse" }, + /* 293 */ { ud_itab__293, UD_TAB__OPC_SSE, "/sse" }, + /* 294 */ { ud_itab__294, UD_TAB__OPC_SSE, "/sse" }, + /* 295 */ { ud_itab__295, UD_TAB__OPC_SSE, "/sse" }, + /* 296 */ { ud_itab__296, UD_TAB__OPC_SSE, "/sse" }, + /* 297 */ { ud_itab__297, UD_TAB__OPC_SSE, "/sse" }, + /* 298 */ { ud_itab__298, UD_TAB__OPC_SSE, "/sse" }, + /* 299 */ { ud_itab__299, UD_TAB__OPC_SSE, "/sse" }, + /* 300 */ { ud_itab__300, UD_TAB__OPC_SSE, "/sse" }, + /* 301 */ { ud_itab__301, UD_TAB__OPC_REG, "/reg" }, + /* 302 */ { ud_itab__302, UD_TAB__OPC_SSE, "/sse" }, + /* 303 */ { ud_itab__303, UD_TAB__OPC_SSE, "/sse" }, + /* 304 */ { ud_itab__304, UD_TAB__OPC_SSE, "/sse" }, + /* 305 */ { ud_itab__305, UD_TAB__OPC_REG, "/reg" }, + /* 306 */ { ud_itab__306, UD_TAB__OPC_SSE, "/sse" }, + /* 307 */ { ud_itab__307, UD_TAB__OPC_SSE, "/sse" }, + /* 308 */ { ud_itab__308, UD_TAB__OPC_SSE, "/sse" }, + /* 309 */ { ud_itab__309, UD_TAB__OPC_REG, "/reg" }, + /* 310 */ { ud_itab__310, UD_TAB__OPC_SSE, "/sse" }, + /* 311 */ { ud_itab__311, UD_TAB__OPC_SSE, "/sse" }, + /* 312 */ { ud_itab__312, UD_TAB__OPC_SSE, "/sse" }, + /* 313 */ { ud_itab__313, UD_TAB__OPC_SSE, "/sse" }, + /* 314 */ { ud_itab__314, UD_TAB__OPC_SSE, "/sse" }, + /* 315 */ { ud_itab__315, UD_TAB__OPC_SSE, "/sse" }, + /* 316 */ { ud_itab__316, UD_TAB__OPC_SSE, "/sse" }, + /* 317 */ { ud_itab__317, UD_TAB__OPC_SSE, "/sse" }, + /* 318 */ { ud_itab__318, UD_TAB__OPC_SSE, "/sse" }, + /* 319 */ { ud_itab__319, UD_TAB__OPC_VENDOR, "intel" }, + /* 320 */ { ud_itab__320, UD_TAB__OPC_SSE, "/sse" }, + /* 321 */ { ud_itab__321, UD_TAB__OPC_VENDOR, "intel" }, + /* 322 */ { ud_itab__322, UD_TAB__OPC_SSE, "/sse" }, + /* 323 */ { ud_itab__323, UD_TAB__OPC_SSE, "/sse" }, + /* 324 */ { ud_itab__324, UD_TAB__OPC_SSE, "/sse" }, + /* 325 */ { ud_itab__325, UD_TAB__OPC_SSE, "/sse" }, + /* 326 */ { ud_itab__326, UD_TAB__OPC_SSE, "/sse" }, + /* 327 */ { ud_itab__327, UD_TAB__OPC_SSE, "/sse" }, + /* 328 */ { ud_itab__328, UD_TAB__OPC_SSE, "/sse" }, + /* 329 */ { ud_itab__329, UD_TAB__OPC_SSE, "/sse" }, + /* 330 */ { ud_itab__330, UD_TAB__OPC_SSE, "/sse" }, + /* 331 */ { ud_itab__331, UD_TAB__OPC_SSE, "/sse" }, + /* 332 */ { ud_itab__332, UD_TAB__OPC_SSE, "/sse" }, + /* 333 */ { ud_itab__333, UD_TAB__OPC_SSE, "/sse" }, + /* 334 */ { ud_itab__334, UD_TAB__OPC_SSE, "/sse" }, + /* 335 */ { ud_itab__335, UD_TAB__OPC_SSE, "/sse" }, + /* 336 */ { ud_itab__336, UD_TAB__OPC_SSE, "/sse" }, + /* 337 */ { ud_itab__337, UD_TAB__OPC_SSE, "/sse" }, + /* 338 */ { ud_itab__338, UD_TAB__OPC_SSE, "/sse" }, + /* 339 */ { ud_itab__339, UD_TAB__OPC_SSE, "/sse" }, + /* 340 */ { ud_itab__340, UD_TAB__OPC_SSE, "/sse" }, + /* 341 */ { ud_itab__341, UD_TAB__OPC_SSE, "/sse" }, + /* 342 */ { ud_itab__342, UD_TAB__OPC_SSE, "/sse" }, + /* 343 */ { ud_itab__343, UD_TAB__OPC_SSE, "/sse" }, + /* 344 */ { ud_itab__344, UD_TAB__OPC_SSE, "/sse" }, + /* 345 */ { ud_itab__345, UD_TAB__OPC_SSE, "/sse" }, + /* 346 */ { ud_itab__346, UD_TAB__OPC_SSE, "/sse" }, + /* 347 */ { ud_itab__347, UD_TAB__OPC_SSE, "/sse" }, + /* 348 */ { ud_itab__348, UD_TAB__OPC_SSE, "/sse" }, + /* 349 */ { ud_itab__349, UD_TAB__OPC_SSE, "/sse" }, + /* 350 */ { ud_itab__350, UD_TAB__OPC_SSE, "/sse" }, + /* 351 */ { ud_itab__351, UD_TAB__OPC_SSE, "/sse" }, + /* 352 */ { ud_itab__352, UD_TAB__OPC_SSE, "/sse" }, + /* 353 */ { ud_itab__353, UD_TAB__OPC_SSE, "/sse" }, + /* 354 */ { ud_itab__354, UD_TAB__OPC_SSE, "/sse" }, + /* 355 */ { ud_itab__355, UD_TAB__OPC_SSE, "/sse" }, + /* 356 */ { ud_itab__356, UD_TAB__OPC_SSE, "/sse" }, + /* 357 */ { ud_itab__357, UD_TAB__OPC_SSE, "/sse" }, + /* 358 */ { ud_itab__358, UD_TAB__OPC_SSE, "/sse" }, + /* 359 */ { ud_itab__359, UD_TAB__OPC_SSE, "/sse" }, + /* 360 */ { ud_itab__360, UD_TAB__OPC_SSE, "/sse" }, + /* 361 */ { ud_itab__361, UD_TAB__OPC_SSE, "/sse" }, + /* 362 */ { ud_itab__362, UD_TAB__OPC_SSE, "/sse" }, + /* 363 */ { ud_itab__363, UD_TAB__OPC_SSE, "/sse" }, + /* 364 */ { ud_itab__364, UD_TAB__OPC_MOD, "/mod" }, + /* 365 */ { ud_itab__365, UD_TAB__OPC_REG, "/reg" }, + /* 366 */ { ud_itab__366, UD_TAB__OPC_RM, "/rm" }, + /* 367 */ { ud_itab__367, UD_TAB__OPC_SSE, "/sse" }, + /* 368 */ { ud_itab__368, UD_TAB__OPC_MOD, "/mod" }, + /* 369 */ { ud_itab__369, UD_TAB__OPC_RM, "/rm" }, + /* 370 */ { ud_itab__370, UD_TAB__OPC_SSE, "/sse" }, + /* 371 */ { ud_itab__371, UD_TAB__OPC_MOD, "/mod" }, + /* 372 */ { ud_itab__372, UD_TAB__OPC_RM, "/rm" }, + /* 373 */ { ud_itab__373, UD_TAB__OPC_SSE, "/sse" }, + /* 374 */ { ud_itab__374, UD_TAB__OPC_MOD, "/mod" }, + /* 375 */ { ud_itab__375, UD_TAB__OPC_MOD, "/mod" }, + /* 376 */ { ud_itab__376, UD_TAB__OPC_REG, "/reg" }, + /* 377 */ { ud_itab__377, UD_TAB__OPC_RM, "/rm" }, + /* 378 */ { ud_itab__378, UD_TAB__OPC_SSE, "/sse" }, + /* 379 */ { ud_itab__379, UD_TAB__OPC_MOD, "/mod" }, + /* 380 */ { ud_itab__380, UD_TAB__OPC_RM, "/rm" }, + /* 381 */ { ud_itab__381, UD_TAB__OPC_SSE, "/sse" }, + /* 382 */ { ud_itab__382, UD_TAB__OPC_MOD, "/mod" }, + /* 383 */ { ud_itab__383, UD_TAB__OPC_RM, "/rm" }, + /* 384 */ { ud_itab__384, UD_TAB__OPC_SSE, "/sse" }, + /* 385 */ { ud_itab__385, UD_TAB__OPC_MOD, "/mod" }, + /* 386 */ { ud_itab__386, UD_TAB__OPC_RM, "/rm" }, + /* 387 */ { ud_itab__387, UD_TAB__OPC_SSE, "/sse" }, + /* 388 */ { ud_itab__388, UD_TAB__OPC_MOD, "/mod" }, + /* 389 */ { ud_itab__389, UD_TAB__OPC_RM, "/rm" }, + /* 390 */ { ud_itab__390, UD_TAB__OPC_SSE, "/sse" }, + /* 391 */ { ud_itab__391, UD_TAB__OPC_MOD, "/mod" }, + /* 392 */ { ud_itab__392, UD_TAB__OPC_RM, "/rm" }, + /* 393 */ { ud_itab__393, UD_TAB__OPC_SSE, "/sse" }, + /* 394 */ { ud_itab__394, UD_TAB__OPC_MOD, "/mod" }, + /* 395 */ { ud_itab__395, UD_TAB__OPC_SSE, "/sse" }, + /* 396 */ { ud_itab__396, UD_TAB__OPC_SSE, "/sse" }, + /* 397 */ { ud_itab__397, UD_TAB__OPC_SSE, "/sse" }, + /* 398 */ { ud_itab__398, UD_TAB__OPC_SSE, "/sse" }, + /* 399 */ { ud_itab__399, UD_TAB__OPC_SSE, "/sse" }, + /* 400 */ { ud_itab__400, UD_TAB__OPC_SSE, "/sse" }, + /* 401 */ { ud_itab__401, UD_TAB__OPC_MOD, "/mod" }, + /* 402 */ { ud_itab__402, UD_TAB__OPC_REG, "/reg" }, + /* 403 */ { ud_itab__403, UD_TAB__OPC_SSE, "/sse" }, + /* 404 */ { ud_itab__404, UD_TAB__OPC_MOD, "/mod" }, + /* 405 */ { ud_itab__405, UD_TAB__OPC_SSE, "/sse" }, + /* 406 */ { ud_itab__406, UD_TAB__OPC_MOD, "/mod" }, + /* 407 */ { ud_itab__407, UD_TAB__OPC_SSE, "/sse" }, + /* 408 */ { ud_itab__408, UD_TAB__OPC_MOD, "/mod" }, + /* 409 */ { ud_itab__409, UD_TAB__OPC_SSE, "/sse" }, + /* 410 */ { ud_itab__410, UD_TAB__OPC_MOD, "/mod" }, + /* 411 */ { ud_itab__411, UD_TAB__OPC_SSE, "/sse" }, + /* 412 */ { ud_itab__412, UD_TAB__OPC_MOD, "/mod" }, + /* 413 */ { ud_itab__413, UD_TAB__OPC_SSE, "/sse" }, + /* 414 */ { ud_itab__414, UD_TAB__OPC_MOD, "/mod" }, + /* 415 */ { ud_itab__415, UD_TAB__OPC_SSE, "/sse" }, + /* 416 */ { ud_itab__416, UD_TAB__OPC_MOD, "/mod" }, + /* 417 */ { ud_itab__417, UD_TAB__OPC_REG, "/reg" }, + /* 418 */ { ud_itab__418, UD_TAB__OPC_RM, "/rm" }, + /* 419 */ { ud_itab__419, UD_TAB__OPC_SSE, "/sse" }, + /* 420 */ { ud_itab__420, UD_TAB__OPC_MOD, "/mod" }, + /* 421 */ { ud_itab__421, UD_TAB__OPC_SSE, "/sse" }, + /* 422 */ { ud_itab__422, UD_TAB__OPC_MOD, "/mod" }, + /* 423 */ { ud_itab__423, UD_TAB__OPC_SSE, "/sse" }, + /* 424 */ { ud_itab__424, UD_TAB__OPC_MOD, "/mod" }, + /* 425 */ { ud_itab__425, UD_TAB__OPC_SSE, "/sse" }, + /* 426 */ { ud_itab__426, UD_TAB__OPC_MOD, "/mod" }, + /* 427 */ { ud_itab__427, UD_TAB__OPC_SSE, "/sse" }, + /* 428 */ { ud_itab__428, UD_TAB__OPC_MOD, "/mod" }, + /* 429 */ { ud_itab__429, UD_TAB__OPC_SSE, "/sse" }, + /* 430 */ { ud_itab__430, UD_TAB__OPC_MOD, "/mod" }, + /* 431 */ { ud_itab__431, UD_TAB__OPC_SSE, "/sse" }, + /* 432 */ { ud_itab__432, UD_TAB__OPC_MOD, "/mod" }, + /* 433 */ { ud_itab__433, UD_TAB__OPC_SSE, "/sse" }, + /* 434 */ { ud_itab__434, UD_TAB__OPC_MOD, "/mod" }, + /* 435 */ { ud_itab__435, UD_TAB__OPC_RM, "/rm" }, + /* 436 */ { ud_itab__436, UD_TAB__OPC_SSE, "/sse" }, + /* 437 */ { ud_itab__437, UD_TAB__OPC_MOD, "/mod" }, + /* 438 */ { ud_itab__438, UD_TAB__OPC_SSE, "/sse" }, + /* 439 */ { ud_itab__439, UD_TAB__OPC_MOD, "/mod" }, + /* 440 */ { ud_itab__440, UD_TAB__OPC_SSE, "/sse" }, + /* 441 */ { ud_itab__441, UD_TAB__OPC_MOD, "/mod" }, + /* 442 */ { ud_itab__442, UD_TAB__OPC_SSE, "/sse" }, + /* 443 */ { ud_itab__443, UD_TAB__OPC_MOD, "/mod" }, + /* 444 */ { ud_itab__444, UD_TAB__OPC_SSE, "/sse" }, + /* 445 */ { ud_itab__445, UD_TAB__OPC_MOD, "/mod" }, + /* 446 */ { ud_itab__446, UD_TAB__OPC_SSE, "/sse" }, + /* 447 */ { ud_itab__447, UD_TAB__OPC_MOD, "/mod" }, + /* 448 */ { ud_itab__448, UD_TAB__OPC_SSE, "/sse" }, + /* 449 */ { ud_itab__449, UD_TAB__OPC_MOD, "/mod" }, + /* 450 */ { ud_itab__450, UD_TAB__OPC_SSE, "/sse" }, + /* 451 */ { ud_itab__451, UD_TAB__OPC_MOD, "/mod" }, + /* 452 */ { ud_itab__452, UD_TAB__OPC_RM, "/rm" }, + /* 453 */ { ud_itab__453, UD_TAB__OPC_SSE, "/sse" }, + /* 454 */ { ud_itab__454, UD_TAB__OPC_MOD, "/mod" }, + /* 455 */ { ud_itab__455, UD_TAB__OPC_SSE, "/sse" }, + /* 456 */ { ud_itab__456, UD_TAB__OPC_MOD, "/mod" }, + /* 457 */ { ud_itab__457, UD_TAB__OPC_SSE, "/sse" }, + /* 458 */ { ud_itab__458, UD_TAB__OPC_MOD, "/mod" }, + /* 459 */ { ud_itab__459, UD_TAB__OPC_SSE, "/sse" }, + /* 460 */ { ud_itab__460, UD_TAB__OPC_MOD, "/mod" }, + /* 461 */ { ud_itab__461, UD_TAB__OPC_SSE, "/sse" }, + /* 462 */ { ud_itab__462, UD_TAB__OPC_MOD, "/mod" }, + /* 463 */ { ud_itab__463, UD_TAB__OPC_SSE, "/sse" }, + /* 464 */ { ud_itab__464, UD_TAB__OPC_MOD, "/mod" }, + /* 465 */ { ud_itab__465, UD_TAB__OPC_SSE, "/sse" }, + /* 466 */ { ud_itab__466, UD_TAB__OPC_MOD, "/mod" }, + /* 467 */ { ud_itab__467, UD_TAB__OPC_SSE, "/sse" }, + /* 468 */ { ud_itab__468, UD_TAB__OPC_MOD, "/mod" }, + /* 469 */ { ud_itab__469, UD_TAB__OPC_SSE, "/sse" }, + /* 470 */ { ud_itab__470, UD_TAB__OPC_SSE, "/sse" }, + /* 471 */ { ud_itab__471, UD_TAB__OPC_SSE, "/sse" }, + /* 472 */ { ud_itab__472, UD_TAB__OPC_SSE, "/sse" }, + /* 473 */ { ud_itab__473, UD_TAB__OPC_SSE, "/sse" }, + /* 474 */ { ud_itab__474, UD_TAB__OPC_SSE, "/sse" }, + /* 475 */ { ud_itab__475, UD_TAB__OPC_SSE, "/sse" }, + /* 476 */ { ud_itab__476, UD_TAB__OPC_SSE, "/sse" }, + /* 477 */ { ud_itab__477, UD_TAB__OPC_SSE, "/sse" }, + /* 478 */ { ud_itab__478, UD_TAB__OPC_SSE, "/sse" }, + /* 479 */ { ud_itab__479, UD_TAB__OPC_REG, "/reg" }, + /* 480 */ { ud_itab__480, UD_TAB__OPC_SSE, "/sse" }, + /* 481 */ { ud_itab__481, UD_TAB__OPC_SSE, "/sse" }, + /* 482 */ { ud_itab__482, UD_TAB__OPC_SSE, "/sse" }, + /* 483 */ { ud_itab__483, UD_TAB__OPC_SSE, "/sse" }, + /* 484 */ { ud_itab__484, UD_TAB__OPC_SSE, "/sse" }, + /* 485 */ { ud_itab__485, UD_TAB__OPC_SSE, "/sse" }, + /* 486 */ { ud_itab__486, UD_TAB__OPC_SSE, "/sse" }, + /* 487 */ { ud_itab__487, UD_TAB__OPC_SSE, "/sse" }, + /* 488 */ { ud_itab__488, UD_TAB__OPC_SSE, "/sse" }, + /* 489 */ { ud_itab__489, UD_TAB__OPC_SSE, "/sse" }, + /* 490 */ { ud_itab__490, UD_TAB__OPC_SSE, "/sse" }, + /* 491 */ { ud_itab__491, UD_TAB__OPC_SSE, "/sse" }, + /* 492 */ { ud_itab__492, UD_TAB__OPC_SSE, "/sse" }, + /* 493 */ { ud_itab__493, UD_TAB__OPC_SSE, "/sse" }, + /* 494 */ { ud_itab__494, UD_TAB__OPC_SSE, "/sse" }, + /* 495 */ { ud_itab__495, UD_TAB__OPC_SSE, "/sse" }, + /* 496 */ { ud_itab__496, UD_TAB__OPC_REG, "/reg" }, + /* 497 */ { ud_itab__497, UD_TAB__OPC_SSE, "/sse" }, + /* 498 */ { ud_itab__498, UD_TAB__OPC_OSIZE, "/o" }, + /* 499 */ { ud_itab__499, UD_TAB__OPC_SSE, "/sse" }, + /* 500 */ { ud_itab__500, UD_TAB__OPC_VENDOR, "intel" }, + /* 501 */ { ud_itab__501, UD_TAB__OPC_VENDOR, "intel" }, + /* 502 */ { ud_itab__502, UD_TAB__OPC_VENDOR, "intel" }, + /* 503 */ { ud_itab__503, UD_TAB__OPC_SSE, "/sse" }, + /* 504 */ { ud_itab__504, UD_TAB__OPC_VENDOR, "intel" }, + /* 505 */ { ud_itab__505, UD_TAB__OPC_SSE, "/sse" }, + /* 506 */ { ud_itab__506, UD_TAB__OPC_SSE, "/sse" }, + /* 507 */ { ud_itab__507, UD_TAB__OPC_SSE, "/sse" }, + /* 508 */ { ud_itab__508, UD_TAB__OPC_SSE, "/sse" }, + /* 509 */ { ud_itab__509, UD_TAB__OPC_SSE, "/sse" }, + /* 510 */ { ud_itab__510, UD_TAB__OPC_SSE, "/sse" }, + /* 511 */ { ud_itab__511, UD_TAB__OPC_SSE, "/sse" }, + /* 512 */ { ud_itab__512, UD_TAB__OPC_SSE, "/sse" }, + /* 513 */ { ud_itab__513, UD_TAB__OPC_SSE, "/sse" }, + /* 514 */ { ud_itab__514, UD_TAB__OPC_SSE, "/sse" }, + /* 515 */ { ud_itab__515, UD_TAB__OPC_SSE, "/sse" }, + /* 516 */ { ud_itab__516, UD_TAB__OPC_SSE, "/sse" }, + /* 517 */ { ud_itab__517, UD_TAB__OPC_SSE, "/sse" }, + /* 518 */ { ud_itab__518, UD_TAB__OPC_SSE, "/sse" }, + /* 519 */ { ud_itab__519, UD_TAB__OPC_SSE, "/sse" }, + /* 520 */ { ud_itab__520, UD_TAB__OPC_SSE, "/sse" }, + /* 521 */ { ud_itab__521, UD_TAB__OPC_SSE, "/sse" }, + /* 522 */ { ud_itab__522, UD_TAB__OPC_SSE, "/sse" }, + /* 523 */ { ud_itab__523, UD_TAB__OPC_SSE, "/sse" }, + /* 524 */ { ud_itab__524, UD_TAB__OPC_SSE, "/sse" }, + /* 525 */ { ud_itab__525, UD_TAB__OPC_SSE, "/sse" }, + /* 526 */ { ud_itab__526, UD_TAB__OPC_SSE, "/sse" }, + /* 527 */ { ud_itab__527, UD_TAB__OPC_SSE, "/sse" }, + /* 528 */ { ud_itab__528, UD_TAB__OPC_SSE, "/sse" }, + /* 529 */ { ud_itab__529, UD_TAB__OPC_SSE, "/sse" }, + /* 530 */ { ud_itab__530, UD_TAB__OPC_SSE, "/sse" }, + /* 531 */ { ud_itab__531, UD_TAB__OPC_SSE, "/sse" }, + /* 532 */ { ud_itab__532, UD_TAB__OPC_SSE, "/sse" }, + /* 533 */ { ud_itab__533, UD_TAB__OPC_SSE, "/sse" }, + /* 534 */ { ud_itab__534, UD_TAB__OPC_SSE, "/sse" }, + /* 535 */ { ud_itab__535, UD_TAB__OPC_SSE, "/sse" }, + /* 536 */ { ud_itab__536, UD_TAB__OPC_SSE, "/sse" }, + /* 537 */ { ud_itab__537, UD_TAB__OPC_SSE, "/sse" }, + /* 538 */ { ud_itab__538, UD_TAB__OPC_SSE, "/sse" }, + /* 539 */ { ud_itab__539, UD_TAB__OPC_SSE, "/sse" }, + /* 540 */ { ud_itab__540, UD_TAB__OPC_SSE, "/sse" }, + /* 541 */ { ud_itab__541, UD_TAB__OPC_SSE, "/sse" }, + /* 542 */ { ud_itab__542, UD_TAB__OPC_SSE, "/sse" }, + /* 543 */ { ud_itab__543, UD_TAB__OPC_SSE, "/sse" }, + /* 544 */ { ud_itab__544, UD_TAB__OPC_SSE, "/sse" }, + /* 545 */ { ud_itab__545, UD_TAB__OPC_SSE, "/sse" }, + /* 546 */ { ud_itab__546, UD_TAB__OPC_SSE, "/sse" }, + /* 547 */ { ud_itab__547, UD_TAB__OPC_SSE, "/sse" }, + /* 548 */ { ud_itab__548, UD_TAB__OPC_SSE, "/sse" }, + /* 549 */ { ud_itab__549, UD_TAB__OPC_SSE, "/sse" }, + /* 550 */ { ud_itab__550, UD_TAB__OPC_SSE, "/sse" }, + /* 551 */ { ud_itab__551, UD_TAB__OPC_SSE, "/sse" }, + /* 552 */ { ud_itab__552, UD_TAB__OPC_MOD, "/mod" }, + /* 553 */ { ud_itab__553, UD_TAB__OPC_SSE, "/sse" }, + /* 554 */ { ud_itab__554, UD_TAB__OPC_MOD, "/mod" }, + /* 555 */ { ud_itab__555, UD_TAB__OPC_MOD, "/mod" }, + /* 556 */ { ud_itab__556, UD_TAB__OPC_SSE, "/sse" }, + /* 557 */ { ud_itab__557, UD_TAB__OPC_SSE, "/sse" }, + /* 558 */ { ud_itab__558, UD_TAB__OPC_SSE, "/sse" }, + /* 559 */ { ud_itab__559, UD_TAB__OPC_SSE, "/sse" }, + /* 560 */ { ud_itab__560, UD_TAB__OPC_SSE, "/sse" }, + /* 561 */ { ud_itab__561, UD_TAB__OPC_SSE, "/sse" }, + /* 562 */ { ud_itab__562, UD_TAB__OPC_SSE, "/sse" }, + /* 563 */ { ud_itab__563, UD_TAB__OPC_MODE, "/m" }, + /* 564 */ { ud_itab__564, UD_TAB__OPC_MODE, "/m" }, + /* 565 */ { ud_itab__565, UD_TAB__OPC_MODE, "/m" }, + /* 566 */ { ud_itab__566, UD_TAB__OPC_MODE, "/m" }, + /* 567 */ { ud_itab__567, UD_TAB__OPC_MODE, "/m" }, + /* 568 */ { ud_itab__568, UD_TAB__OPC_MODE, "/m" }, + /* 569 */ { ud_itab__569, UD_TAB__OPC_MODE, "/m" }, + /* 570 */ { ud_itab__570, UD_TAB__OPC_MODE, "/m" }, + /* 571 */ { ud_itab__571, UD_TAB__OPC_OSIZE, "/o" }, + /* 572 */ { ud_itab__572, UD_TAB__OPC_MODE, "/m" }, + /* 573 */ { ud_itab__573, UD_TAB__OPC_MODE, "/m" }, + /* 574 */ { ud_itab__574, UD_TAB__OPC_OSIZE, "/o" }, + /* 575 */ { ud_itab__575, UD_TAB__OPC_MODE, "/m" }, + /* 576 */ { ud_itab__576, UD_TAB__OPC_MODE, "/m" }, + /* 577 */ { ud_itab__577, UD_TAB__OPC_MODE, "/m" }, + /* 578 */ { ud_itab__578, UD_TAB__OPC_MODE, "/m" }, + /* 579 */ { ud_itab__579, UD_TAB__OPC_OSIZE, "/o" }, + /* 580 */ { ud_itab__580, UD_TAB__OPC_OSIZE, "/o" }, + /* 581 */ { ud_itab__581, UD_TAB__OPC_REG, "/reg" }, + /* 582 */ { ud_itab__582, UD_TAB__OPC_REG, "/reg" }, + /* 583 */ { ud_itab__583, UD_TAB__OPC_REG, "/reg" }, + /* 584 */ { ud_itab__584, UD_TAB__OPC_MODE, "/m" }, + /* 585 */ { ud_itab__585, UD_TAB__OPC_MODE, "/m" }, + /* 586 */ { ud_itab__586, UD_TAB__OPC_MODE, "/m" }, + /* 587 */ { ud_itab__587, UD_TAB__OPC_MODE, "/m" }, + /* 588 */ { ud_itab__588, UD_TAB__OPC_MODE, "/m" }, + /* 589 */ { ud_itab__589, UD_TAB__OPC_MODE, "/m" }, + /* 590 */ { ud_itab__590, UD_TAB__OPC_MODE, "/m" }, + /* 591 */ { ud_itab__591, UD_TAB__OPC_MODE, "/m" }, + /* 592 */ { ud_itab__592, UD_TAB__OPC_REG, "/reg" }, + /* 593 */ { ud_itab__593, UD_TAB__OPC_REG, "/reg" }, + /* 594 */ { ud_itab__594, UD_TAB__OPC_OSIZE, "/o" }, + /* 595 */ { ud_itab__595, UD_TAB__OPC_OSIZE, "/o" }, + /* 596 */ { ud_itab__596, UD_TAB__OPC_MODE, "/m" }, + /* 597 */ { ud_itab__597, UD_TAB__OPC_OSIZE, "/o" }, + /* 598 */ { ud_itab__598, UD_TAB__OPC_MODE, "/m" }, + /* 599 */ { ud_itab__599, UD_TAB__OPC_MODE, "/m" }, + /* 600 */ { ud_itab__600, UD_TAB__OPC_MODE, "/m" }, + /* 601 */ { ud_itab__601, UD_TAB__OPC_OSIZE, "/o" }, + /* 602 */ { ud_itab__602, UD_TAB__OPC_MODE, "/m" }, + /* 603 */ { ud_itab__603, UD_TAB__OPC_MODE, "/m" }, + /* 604 */ { ud_itab__604, UD_TAB__OPC_MODE, "/m" }, + /* 605 */ { ud_itab__605, UD_TAB__OPC_OSIZE, "/o" }, + /* 606 */ { ud_itab__606, UD_TAB__OPC_OSIZE, "/o" }, + /* 607 */ { ud_itab__607, UD_TAB__OPC_OSIZE, "/o" }, + /* 608 */ { ud_itab__608, UD_TAB__OPC_OSIZE, "/o" }, + /* 609 */ { ud_itab__609, UD_TAB__OPC_OSIZE, "/o" }, + /* 610 */ { ud_itab__610, UD_TAB__OPC_REG, "/reg" }, + /* 611 */ { ud_itab__611, UD_TAB__OPC_REG, "/reg" }, + /* 612 */ { ud_itab__612, UD_TAB__OPC_MODE, "/m" }, + /* 613 */ { ud_itab__613, UD_TAB__OPC_MODE, "/m" }, + /* 614 */ { ud_itab__614, UD_TAB__OPC_REG, "/reg" }, + /* 615 */ { ud_itab__615, UD_TAB__OPC_REG, "/reg" }, + /* 616 */ { ud_itab__616, UD_TAB__OPC_MODE, "/m" }, + /* 617 */ { ud_itab__617, UD_TAB__OPC_OSIZE, "/o" }, + /* 618 */ { ud_itab__618, UD_TAB__OPC_REG, "/reg" }, + /* 619 */ { ud_itab__619, UD_TAB__OPC_REG, "/reg" }, + /* 620 */ { ud_itab__620, UD_TAB__OPC_REG, "/reg" }, + /* 621 */ { ud_itab__621, UD_TAB__OPC_REG, "/reg" }, + /* 622 */ { ud_itab__622, UD_TAB__OPC_MODE, "/m" }, + /* 623 */ { ud_itab__623, UD_TAB__OPC_MODE, "/m" }, + /* 624 */ { ud_itab__624, UD_TAB__OPC_MODE, "/m" }, + /* 625 */ { ud_itab__625, UD_TAB__OPC_MOD, "/mod" }, + /* 626 */ { ud_itab__626, UD_TAB__OPC_REG, "/reg" }, + /* 627 */ { ud_itab__627, UD_TAB__OPC_MOD, "/mod" }, + /* 628 */ { ud_itab__628, UD_TAB__OPC_MOD, "/mod" }, + /* 629 */ { ud_itab__629, UD_TAB__OPC_MOD, "/mod" }, + /* 630 */ { ud_itab__630, UD_TAB__OPC_MOD, "/mod" }, + /* 631 */ { ud_itab__631, UD_TAB__OPC_MOD, "/mod" }, + /* 632 */ { ud_itab__632, UD_TAB__OPC_MOD, "/mod" }, + /* 633 */ { ud_itab__633, UD_TAB__OPC_MOD, "/mod" }, + /* 634 */ { ud_itab__634, UD_TAB__OPC_MOD, "/mod" }, + /* 635 */ { ud_itab__635, UD_TAB__OPC_X87, "/x87" }, + /* 636 */ { ud_itab__636, UD_TAB__OPC_MOD, "/mod" }, + /* 637 */ { ud_itab__637, UD_TAB__OPC_MOD, "/mod" }, + /* 638 */ { ud_itab__638, UD_TAB__OPC_MOD, "/mod" }, + /* 639 */ { ud_itab__639, UD_TAB__OPC_MOD, "/mod" }, + /* 640 */ { ud_itab__640, UD_TAB__OPC_MOD, "/mod" }, + /* 641 */ { ud_itab__641, UD_TAB__OPC_MOD, "/mod" }, + /* 642 */ { ud_itab__642, UD_TAB__OPC_MOD, "/mod" }, + /* 643 */ { ud_itab__643, UD_TAB__OPC_MOD, "/mod" }, + /* 644 */ { ud_itab__644, UD_TAB__OPC_MOD, "/mod" }, + /* 645 */ { ud_itab__645, UD_TAB__OPC_MOD, "/mod" }, + /* 646 */ { ud_itab__646, UD_TAB__OPC_MOD, "/mod" }, + /* 647 */ { ud_itab__647, UD_TAB__OPC_MOD, "/mod" }, + /* 648 */ { ud_itab__648, UD_TAB__OPC_MOD, "/mod" }, + /* 649 */ { ud_itab__649, UD_TAB__OPC_MOD, "/mod" }, + /* 650 */ { ud_itab__650, UD_TAB__OPC_MOD, "/mod" }, + /* 651 */ { ud_itab__651, UD_TAB__OPC_MOD, "/mod" }, + /* 652 */ { ud_itab__652, UD_TAB__OPC_MOD, "/mod" }, + /* 653 */ { ud_itab__653, UD_TAB__OPC_MOD, "/mod" }, + /* 654 */ { ud_itab__654, UD_TAB__OPC_MOD, "/mod" }, + /* 655 */ { ud_itab__655, UD_TAB__OPC_MOD, "/mod" }, + /* 656 */ { ud_itab__656, UD_TAB__OPC_MOD, "/mod" }, + /* 657 */ { ud_itab__657, UD_TAB__OPC_MOD, "/mod" }, + /* 658 */ { ud_itab__658, UD_TAB__OPC_MOD, "/mod" }, + /* 659 */ { ud_itab__659, UD_TAB__OPC_MOD, "/mod" }, + /* 660 */ { ud_itab__660, UD_TAB__OPC_MOD, "/mod" }, + /* 661 */ { ud_itab__661, UD_TAB__OPC_MOD, "/mod" }, + /* 662 */ { ud_itab__662, UD_TAB__OPC_MOD, "/mod" }, + /* 663 */ { ud_itab__663, UD_TAB__OPC_MOD, "/mod" }, + /* 664 */ { ud_itab__664, UD_TAB__OPC_MOD, "/mod" }, + /* 665 */ { ud_itab__665, UD_TAB__OPC_MOD, "/mod" }, + /* 666 */ { ud_itab__666, UD_TAB__OPC_MOD, "/mod" }, + /* 667 */ { ud_itab__667, UD_TAB__OPC_MOD, "/mod" }, + /* 668 */ { ud_itab__668, UD_TAB__OPC_MOD, "/mod" }, + /* 669 */ { ud_itab__669, UD_TAB__OPC_MOD, "/mod" }, + /* 670 */ { ud_itab__670, UD_TAB__OPC_MOD, "/mod" }, + /* 671 */ { ud_itab__671, UD_TAB__OPC_MOD, "/mod" }, + /* 672 */ { ud_itab__672, UD_TAB__OPC_MOD, "/mod" }, + /* 673 */ { ud_itab__673, UD_TAB__OPC_MOD, "/mod" }, + /* 674 */ { ud_itab__674, UD_TAB__OPC_MOD, "/mod" }, + /* 675 */ { ud_itab__675, UD_TAB__OPC_MOD, "/mod" }, + /* 676 */ { ud_itab__676, UD_TAB__OPC_MOD, "/mod" }, + /* 677 */ { ud_itab__677, UD_TAB__OPC_MOD, "/mod" }, + /* 678 */ { ud_itab__678, UD_TAB__OPC_MOD, "/mod" }, + /* 679 */ { ud_itab__679, UD_TAB__OPC_MOD, "/mod" }, + /* 680 */ { ud_itab__680, UD_TAB__OPC_MOD, "/mod" }, + /* 681 */ { ud_itab__681, UD_TAB__OPC_MOD, "/mod" }, + /* 682 */ { ud_itab__682, UD_TAB__OPC_MOD, "/mod" }, + /* 683 */ { ud_itab__683, UD_TAB__OPC_MOD, "/mod" }, + /* 684 */ { ud_itab__684, UD_TAB__OPC_MOD, "/mod" }, + /* 685 */ { ud_itab__685, UD_TAB__OPC_MOD, "/mod" }, + /* 686 */ { ud_itab__686, UD_TAB__OPC_MOD, "/mod" }, + /* 687 */ { ud_itab__687, UD_TAB__OPC_MOD, "/mod" }, + /* 688 */ { ud_itab__688, UD_TAB__OPC_MOD, "/mod" }, + /* 689 */ { ud_itab__689, UD_TAB__OPC_MOD, "/mod" }, + /* 690 */ { ud_itab__690, UD_TAB__OPC_MOD, "/mod" }, + /* 691 */ { ud_itab__691, UD_TAB__OPC_MOD, "/mod" }, + /* 692 */ { ud_itab__692, UD_TAB__OPC_MOD, "/mod" }, + /* 693 */ { ud_itab__693, UD_TAB__OPC_MOD, "/mod" }, + /* 694 */ { ud_itab__694, UD_TAB__OPC_MOD, "/mod" }, + /* 695 */ { ud_itab__695, UD_TAB__OPC_MOD, "/mod" }, + /* 696 */ { ud_itab__696, UD_TAB__OPC_MOD, "/mod" }, + /* 697 */ { ud_itab__697, UD_TAB__OPC_MOD, "/mod" }, + /* 698 */ { ud_itab__698, UD_TAB__OPC_MOD, "/mod" }, + /* 699 */ { ud_itab__699, UD_TAB__OPC_MOD, "/mod" }, + /* 700 */ { ud_itab__700, UD_TAB__OPC_MOD, "/mod" }, + /* 701 */ { ud_itab__701, UD_TAB__OPC_REG, "/reg" }, + /* 702 */ { ud_itab__702, UD_TAB__OPC_MOD, "/mod" }, + /* 703 */ { ud_itab__703, UD_TAB__OPC_MOD, "/mod" }, + /* 704 */ { ud_itab__704, UD_TAB__OPC_MOD, "/mod" }, + /* 705 */ { ud_itab__705, UD_TAB__OPC_MOD, "/mod" }, + /* 706 */ { ud_itab__706, UD_TAB__OPC_MOD, "/mod" }, + /* 707 */ { ud_itab__707, UD_TAB__OPC_MOD, "/mod" }, + /* 708 */ { ud_itab__708, UD_TAB__OPC_MOD, "/mod" }, + /* 709 */ { ud_itab__709, UD_TAB__OPC_X87, "/x87" }, + /* 710 */ { ud_itab__710, UD_TAB__OPC_MOD, "/mod" }, + /* 711 */ { ud_itab__711, UD_TAB__OPC_MOD, "/mod" }, + /* 712 */ { ud_itab__712, UD_TAB__OPC_MOD, "/mod" }, + /* 713 */ { ud_itab__713, UD_TAB__OPC_MOD, "/mod" }, + /* 714 */ { ud_itab__714, UD_TAB__OPC_MOD, "/mod" }, + /* 715 */ { ud_itab__715, UD_TAB__OPC_MOD, "/mod" }, + /* 716 */ { ud_itab__716, UD_TAB__OPC_MOD, "/mod" }, + /* 717 */ { ud_itab__717, UD_TAB__OPC_MOD, "/mod" }, + /* 718 */ { ud_itab__718, UD_TAB__OPC_MOD, "/mod" }, + /* 719 */ { ud_itab__719, UD_TAB__OPC_MOD, "/mod" }, + /* 720 */ { ud_itab__720, UD_TAB__OPC_MOD, "/mod" }, + /* 721 */ { ud_itab__721, UD_TAB__OPC_MOD, "/mod" }, + /* 722 */ { ud_itab__722, UD_TAB__OPC_MOD, "/mod" }, + /* 723 */ { ud_itab__723, UD_TAB__OPC_MOD, "/mod" }, + /* 724 */ { ud_itab__724, UD_TAB__OPC_MOD, "/mod" }, + /* 725 */ { ud_itab__725, UD_TAB__OPC_MOD, "/mod" }, + /* 726 */ { ud_itab__726, UD_TAB__OPC_MOD, "/mod" }, + /* 727 */ { ud_itab__727, UD_TAB__OPC_MOD, "/mod" }, + /* 728 */ { ud_itab__728, UD_TAB__OPC_MOD, "/mod" }, + /* 729 */ { ud_itab__729, UD_TAB__OPC_MOD, "/mod" }, + /* 730 */ { ud_itab__730, UD_TAB__OPC_MOD, "/mod" }, + /* 731 */ { ud_itab__731, UD_TAB__OPC_MOD, "/mod" }, + /* 732 */ { ud_itab__732, UD_TAB__OPC_MOD, "/mod" }, + /* 733 */ { ud_itab__733, UD_TAB__OPC_MOD, "/mod" }, + /* 734 */ { ud_itab__734, UD_TAB__OPC_MOD, "/mod" }, + /* 735 */ { ud_itab__735, UD_TAB__OPC_MOD, "/mod" }, + /* 736 */ { ud_itab__736, UD_TAB__OPC_MOD, "/mod" }, + /* 737 */ { ud_itab__737, UD_TAB__OPC_MOD, "/mod" }, + /* 738 */ { ud_itab__738, UD_TAB__OPC_MOD, "/mod" }, + /* 739 */ { ud_itab__739, UD_TAB__OPC_MOD, "/mod" }, + /* 740 */ { ud_itab__740, UD_TAB__OPC_MOD, "/mod" }, + /* 741 */ { ud_itab__741, UD_TAB__OPC_MOD, "/mod" }, + /* 742 */ { ud_itab__742, UD_TAB__OPC_MOD, "/mod" }, + /* 743 */ { ud_itab__743, UD_TAB__OPC_MOD, "/mod" }, + /* 744 */ { ud_itab__744, UD_TAB__OPC_MOD, "/mod" }, + /* 745 */ { ud_itab__745, UD_TAB__OPC_MOD, "/mod" }, + /* 746 */ { ud_itab__746, UD_TAB__OPC_MOD, "/mod" }, + /* 747 */ { ud_itab__747, UD_TAB__OPC_MOD, "/mod" }, + /* 748 */ { ud_itab__748, UD_TAB__OPC_MOD, "/mod" }, + /* 749 */ { ud_itab__749, UD_TAB__OPC_MOD, "/mod" }, + /* 750 */ { ud_itab__750, UD_TAB__OPC_MOD, "/mod" }, + /* 751 */ { ud_itab__751, UD_TAB__OPC_MOD, "/mod" }, + /* 752 */ { ud_itab__752, UD_TAB__OPC_MOD, "/mod" }, + /* 753 */ { ud_itab__753, UD_TAB__OPC_MOD, "/mod" }, + /* 754 */ { ud_itab__754, UD_TAB__OPC_MOD, "/mod" }, + /* 755 */ { ud_itab__755, UD_TAB__OPC_MOD, "/mod" }, + /* 756 */ { ud_itab__756, UD_TAB__OPC_MOD, "/mod" }, + /* 757 */ { ud_itab__757, UD_TAB__OPC_MOD, "/mod" }, + /* 758 */ { ud_itab__758, UD_TAB__OPC_MOD, "/mod" }, + /* 759 */ { ud_itab__759, UD_TAB__OPC_MOD, "/mod" }, + /* 760 */ { ud_itab__760, UD_TAB__OPC_MOD, "/mod" }, + /* 761 */ { ud_itab__761, UD_TAB__OPC_MOD, "/mod" }, + /* 762 */ { ud_itab__762, UD_TAB__OPC_MOD, "/mod" }, + /* 763 */ { ud_itab__763, UD_TAB__OPC_REG, "/reg" }, + /* 764 */ { ud_itab__764, UD_TAB__OPC_MOD, "/mod" }, + /* 765 */ { ud_itab__765, UD_TAB__OPC_MOD, "/mod" }, + /* 766 */ { ud_itab__766, UD_TAB__OPC_MOD, "/mod" }, + /* 767 */ { ud_itab__767, UD_TAB__OPC_MOD, "/mod" }, + /* 768 */ { ud_itab__768, UD_TAB__OPC_MOD, "/mod" }, + /* 769 */ { ud_itab__769, UD_TAB__OPC_MOD, "/mod" }, + /* 770 */ { ud_itab__770, UD_TAB__OPC_MOD, "/mod" }, + /* 771 */ { ud_itab__771, UD_TAB__OPC_MOD, "/mod" }, + /* 772 */ { ud_itab__772, UD_TAB__OPC_X87, "/x87" }, + /* 773 */ { ud_itab__773, UD_TAB__OPC_MOD, "/mod" }, + /* 774 */ { ud_itab__774, UD_TAB__OPC_MOD, "/mod" }, + /* 775 */ { ud_itab__775, UD_TAB__OPC_MOD, "/mod" }, + /* 776 */ { ud_itab__776, UD_TAB__OPC_MOD, "/mod" }, + /* 777 */ { ud_itab__777, UD_TAB__OPC_MOD, "/mod" }, + /* 778 */ { ud_itab__778, UD_TAB__OPC_MOD, "/mod" }, + /* 779 */ { ud_itab__779, UD_TAB__OPC_MOD, "/mod" }, + /* 780 */ { ud_itab__780, UD_TAB__OPC_MOD, "/mod" }, + /* 781 */ { ud_itab__781, UD_TAB__OPC_MOD, "/mod" }, + /* 782 */ { ud_itab__782, UD_TAB__OPC_MOD, "/mod" }, + /* 783 */ { ud_itab__783, UD_TAB__OPC_MOD, "/mod" }, + /* 784 */ { ud_itab__784, UD_TAB__OPC_MOD, "/mod" }, + /* 785 */ { ud_itab__785, UD_TAB__OPC_MOD, "/mod" }, + /* 786 */ { ud_itab__786, UD_TAB__OPC_MOD, "/mod" }, + /* 787 */ { ud_itab__787, UD_TAB__OPC_MOD, "/mod" }, + /* 788 */ { ud_itab__788, UD_TAB__OPC_MOD, "/mod" }, + /* 789 */ { ud_itab__789, UD_TAB__OPC_MOD, "/mod" }, + /* 790 */ { ud_itab__790, UD_TAB__OPC_MOD, "/mod" }, + /* 791 */ { ud_itab__791, UD_TAB__OPC_MOD, "/mod" }, + /* 792 */ { ud_itab__792, UD_TAB__OPC_MOD, "/mod" }, + /* 793 */ { ud_itab__793, UD_TAB__OPC_MOD, "/mod" }, + /* 794 */ { ud_itab__794, UD_TAB__OPC_MOD, "/mod" }, + /* 795 */ { ud_itab__795, UD_TAB__OPC_MOD, "/mod" }, + /* 796 */ { ud_itab__796, UD_TAB__OPC_MOD, "/mod" }, + /* 797 */ { ud_itab__797, UD_TAB__OPC_MOD, "/mod" }, + /* 798 */ { ud_itab__798, UD_TAB__OPC_MOD, "/mod" }, + /* 799 */ { ud_itab__799, UD_TAB__OPC_MOD, "/mod" }, + /* 800 */ { ud_itab__800, UD_TAB__OPC_MOD, "/mod" }, + /* 801 */ { ud_itab__801, UD_TAB__OPC_MOD, "/mod" }, + /* 802 */ { ud_itab__802, UD_TAB__OPC_MOD, "/mod" }, + /* 803 */ { ud_itab__803, UD_TAB__OPC_MOD, "/mod" }, + /* 804 */ { ud_itab__804, UD_TAB__OPC_MOD, "/mod" }, + /* 805 */ { ud_itab__805, UD_TAB__OPC_MOD, "/mod" }, + /* 806 */ { ud_itab__806, UD_TAB__OPC_MOD, "/mod" }, + /* 807 */ { ud_itab__807, UD_TAB__OPC_REG, "/reg" }, + /* 808 */ { ud_itab__808, UD_TAB__OPC_MOD, "/mod" }, + /* 809 */ { ud_itab__809, UD_TAB__OPC_MOD, "/mod" }, + /* 810 */ { ud_itab__810, UD_TAB__OPC_MOD, "/mod" }, + /* 811 */ { ud_itab__811, UD_TAB__OPC_MOD, "/mod" }, + /* 812 */ { ud_itab__812, UD_TAB__OPC_MOD, "/mod" }, + /* 813 */ { ud_itab__813, UD_TAB__OPC_MOD, "/mod" }, + /* 814 */ { ud_itab__814, UD_TAB__OPC_X87, "/x87" }, + /* 815 */ { ud_itab__815, UD_TAB__OPC_MOD, "/mod" }, + /* 816 */ { ud_itab__816, UD_TAB__OPC_MOD, "/mod" }, + /* 817 */ { ud_itab__817, UD_TAB__OPC_MOD, "/mod" }, + /* 818 */ { ud_itab__818, UD_TAB__OPC_MOD, "/mod" }, + /* 819 */ { ud_itab__819, UD_TAB__OPC_MOD, "/mod" }, + /* 820 */ { ud_itab__820, UD_TAB__OPC_MOD, "/mod" }, + /* 821 */ { ud_itab__821, UD_TAB__OPC_MOD, "/mod" }, + /* 822 */ { ud_itab__822, UD_TAB__OPC_MOD, "/mod" }, + /* 823 */ { ud_itab__823, UD_TAB__OPC_MOD, "/mod" }, + /* 824 */ { ud_itab__824, UD_TAB__OPC_MOD, "/mod" }, + /* 825 */ { ud_itab__825, UD_TAB__OPC_MOD, "/mod" }, + /* 826 */ { ud_itab__826, UD_TAB__OPC_MOD, "/mod" }, + /* 827 */ { ud_itab__827, UD_TAB__OPC_MOD, "/mod" }, + /* 828 */ { ud_itab__828, UD_TAB__OPC_MOD, "/mod" }, + /* 829 */ { ud_itab__829, UD_TAB__OPC_MOD, "/mod" }, + /* 830 */ { ud_itab__830, UD_TAB__OPC_MOD, "/mod" }, + /* 831 */ { ud_itab__831, UD_TAB__OPC_MOD, "/mod" }, + /* 832 */ { ud_itab__832, UD_TAB__OPC_MOD, "/mod" }, + /* 833 */ { ud_itab__833, UD_TAB__OPC_MOD, "/mod" }, + /* 834 */ { ud_itab__834, UD_TAB__OPC_MOD, "/mod" }, + /* 835 */ { ud_itab__835, UD_TAB__OPC_MOD, "/mod" }, + /* 836 */ { ud_itab__836, UD_TAB__OPC_MOD, "/mod" }, + /* 837 */ { ud_itab__837, UD_TAB__OPC_MOD, "/mod" }, + /* 838 */ { ud_itab__838, UD_TAB__OPC_MOD, "/mod" }, + /* 839 */ { ud_itab__839, UD_TAB__OPC_MOD, "/mod" }, + /* 840 */ { ud_itab__840, UD_TAB__OPC_MOD, "/mod" }, + /* 841 */ { ud_itab__841, UD_TAB__OPC_MOD, "/mod" }, + /* 842 */ { ud_itab__842, UD_TAB__OPC_MOD, "/mod" }, + /* 843 */ { ud_itab__843, UD_TAB__OPC_MOD, "/mod" }, + /* 844 */ { ud_itab__844, UD_TAB__OPC_MOD, "/mod" }, + /* 845 */ { ud_itab__845, UD_TAB__OPC_MOD, "/mod" }, + /* 846 */ { ud_itab__846, UD_TAB__OPC_MOD, "/mod" }, + /* 847 */ { ud_itab__847, UD_TAB__OPC_MOD, "/mod" }, + /* 848 */ { ud_itab__848, UD_TAB__OPC_MOD, "/mod" }, + /* 849 */ { ud_itab__849, UD_TAB__OPC_MOD, "/mod" }, + /* 850 */ { ud_itab__850, UD_TAB__OPC_MOD, "/mod" }, + /* 851 */ { ud_itab__851, UD_TAB__OPC_MOD, "/mod" }, + /* 852 */ { ud_itab__852, UD_TAB__OPC_MOD, "/mod" }, + /* 853 */ { ud_itab__853, UD_TAB__OPC_MOD, "/mod" }, + /* 854 */ { ud_itab__854, UD_TAB__OPC_MOD, "/mod" }, + /* 855 */ { ud_itab__855, UD_TAB__OPC_MOD, "/mod" }, + /* 856 */ { ud_itab__856, UD_TAB__OPC_MOD, "/mod" }, + /* 857 */ { ud_itab__857, UD_TAB__OPC_MOD, "/mod" }, + /* 858 */ { ud_itab__858, UD_TAB__OPC_MOD, "/mod" }, + /* 859 */ { ud_itab__859, UD_TAB__OPC_MOD, "/mod" }, + /* 860 */ { ud_itab__860, UD_TAB__OPC_MOD, "/mod" }, + /* 861 */ { ud_itab__861, UD_TAB__OPC_MOD, "/mod" }, + /* 862 */ { ud_itab__862, UD_TAB__OPC_MOD, "/mod" }, + /* 863 */ { ud_itab__863, UD_TAB__OPC_MOD, "/mod" }, + /* 864 */ { ud_itab__864, UD_TAB__OPC_MOD, "/mod" }, + /* 865 */ { ud_itab__865, UD_TAB__OPC_MOD, "/mod" }, + /* 866 */ { ud_itab__866, UD_TAB__OPC_REG, "/reg" }, + /* 867 */ { ud_itab__867, UD_TAB__OPC_MOD, "/mod" }, + /* 868 */ { ud_itab__868, UD_TAB__OPC_MOD, "/mod" }, + /* 869 */ { ud_itab__869, UD_TAB__OPC_MOD, "/mod" }, + /* 870 */ { ud_itab__870, UD_TAB__OPC_MOD, "/mod" }, + /* 871 */ { ud_itab__871, UD_TAB__OPC_MOD, "/mod" }, + /* 872 */ { ud_itab__872, UD_TAB__OPC_MOD, "/mod" }, + /* 873 */ { ud_itab__873, UD_TAB__OPC_MOD, "/mod" }, + /* 874 */ { ud_itab__874, UD_TAB__OPC_MOD, "/mod" }, + /* 875 */ { ud_itab__875, UD_TAB__OPC_X87, "/x87" }, + /* 876 */ { ud_itab__876, UD_TAB__OPC_MOD, "/mod" }, + /* 877 */ { ud_itab__877, UD_TAB__OPC_MOD, "/mod" }, + /* 878 */ { ud_itab__878, UD_TAB__OPC_MOD, "/mod" }, + /* 879 */ { ud_itab__879, UD_TAB__OPC_MOD, "/mod" }, + /* 880 */ { ud_itab__880, UD_TAB__OPC_MOD, "/mod" }, + /* 881 */ { ud_itab__881, UD_TAB__OPC_MOD, "/mod" }, + /* 882 */ { ud_itab__882, UD_TAB__OPC_MOD, "/mod" }, + /* 883 */ { ud_itab__883, UD_TAB__OPC_MOD, "/mod" }, + /* 884 */ { ud_itab__884, UD_TAB__OPC_MOD, "/mod" }, + /* 885 */ { ud_itab__885, UD_TAB__OPC_MOD, "/mod" }, + /* 886 */ { ud_itab__886, UD_TAB__OPC_MOD, "/mod" }, + /* 887 */ { ud_itab__887, UD_TAB__OPC_MOD, "/mod" }, + /* 888 */ { ud_itab__888, UD_TAB__OPC_MOD, "/mod" }, + /* 889 */ { ud_itab__889, UD_TAB__OPC_MOD, "/mod" }, + /* 890 */ { ud_itab__890, UD_TAB__OPC_MOD, "/mod" }, + /* 891 */ { ud_itab__891, UD_TAB__OPC_MOD, "/mod" }, + /* 892 */ { ud_itab__892, UD_TAB__OPC_MOD, "/mod" }, + /* 893 */ { ud_itab__893, UD_TAB__OPC_MOD, "/mod" }, + /* 894 */ { ud_itab__894, UD_TAB__OPC_MOD, "/mod" }, + /* 895 */ { ud_itab__895, UD_TAB__OPC_MOD, "/mod" }, + /* 896 */ { ud_itab__896, UD_TAB__OPC_MOD, "/mod" }, + /* 897 */ { ud_itab__897, UD_TAB__OPC_MOD, "/mod" }, + /* 898 */ { ud_itab__898, UD_TAB__OPC_MOD, "/mod" }, + /* 899 */ { ud_itab__899, UD_TAB__OPC_MOD, "/mod" }, + /* 900 */ { ud_itab__900, UD_TAB__OPC_MOD, "/mod" }, + /* 901 */ { ud_itab__901, UD_TAB__OPC_MOD, "/mod" }, + /* 902 */ { ud_itab__902, UD_TAB__OPC_MOD, "/mod" }, + /* 903 */ { ud_itab__903, UD_TAB__OPC_MOD, "/mod" }, + /* 904 */ { ud_itab__904, UD_TAB__OPC_MOD, "/mod" }, + /* 905 */ { ud_itab__905, UD_TAB__OPC_MOD, "/mod" }, + /* 906 */ { ud_itab__906, UD_TAB__OPC_MOD, "/mod" }, + /* 907 */ { ud_itab__907, UD_TAB__OPC_MOD, "/mod" }, + /* 908 */ { ud_itab__908, UD_TAB__OPC_MOD, "/mod" }, + /* 909 */ { ud_itab__909, UD_TAB__OPC_MOD, "/mod" }, + /* 910 */ { ud_itab__910, UD_TAB__OPC_MOD, "/mod" }, + /* 911 */ { ud_itab__911, UD_TAB__OPC_MOD, "/mod" }, + /* 912 */ { ud_itab__912, UD_TAB__OPC_MOD, "/mod" }, + /* 913 */ { ud_itab__913, UD_TAB__OPC_MOD, "/mod" }, + /* 914 */ { ud_itab__914, UD_TAB__OPC_MOD, "/mod" }, + /* 915 */ { ud_itab__915, UD_TAB__OPC_MOD, "/mod" }, + /* 916 */ { ud_itab__916, UD_TAB__OPC_MOD, "/mod" }, + /* 917 */ { ud_itab__917, UD_TAB__OPC_MOD, "/mod" }, + /* 918 */ { ud_itab__918, UD_TAB__OPC_MOD, "/mod" }, + /* 919 */ { ud_itab__919, UD_TAB__OPC_MOD, "/mod" }, + /* 920 */ { ud_itab__920, UD_TAB__OPC_MOD, "/mod" }, + /* 921 */ { ud_itab__921, UD_TAB__OPC_MOD, "/mod" }, + /* 922 */ { ud_itab__922, UD_TAB__OPC_MOD, "/mod" }, + /* 923 */ { ud_itab__923, UD_TAB__OPC_MOD, "/mod" }, + /* 924 */ { ud_itab__924, UD_TAB__OPC_MOD, "/mod" }, + /* 925 */ { ud_itab__925, UD_TAB__OPC_MOD, "/mod" }, + /* 926 */ { ud_itab__926, UD_TAB__OPC_MOD, "/mod" }, + /* 927 */ { ud_itab__927, UD_TAB__OPC_MOD, "/mod" }, + /* 928 */ { ud_itab__928, UD_TAB__OPC_MOD, "/mod" }, + /* 929 */ { ud_itab__929, UD_TAB__OPC_MOD, "/mod" }, + /* 930 */ { ud_itab__930, UD_TAB__OPC_MOD, "/mod" }, + /* 931 */ { ud_itab__931, UD_TAB__OPC_MOD, "/mod" }, + /* 932 */ { ud_itab__932, UD_TAB__OPC_MOD, "/mod" }, + /* 933 */ { ud_itab__933, UD_TAB__OPC_MOD, "/mod" }, + /* 934 */ { ud_itab__934, UD_TAB__OPC_MOD, "/mod" }, + /* 935 */ { ud_itab__935, UD_TAB__OPC_MOD, "/mod" }, + /* 936 */ { ud_itab__936, UD_TAB__OPC_MOD, "/mod" }, + /* 937 */ { ud_itab__937, UD_TAB__OPC_MOD, "/mod" }, + /* 938 */ { ud_itab__938, UD_TAB__OPC_MOD, "/mod" }, + /* 939 */ { ud_itab__939, UD_TAB__OPC_MOD, "/mod" }, + /* 940 */ { ud_itab__940, UD_TAB__OPC_MOD, "/mod" }, + /* 941 */ { ud_itab__941, UD_TAB__OPC_REG, "/reg" }, + /* 942 */ { ud_itab__942, UD_TAB__OPC_MOD, "/mod" }, + /* 943 */ { ud_itab__943, UD_TAB__OPC_MOD, "/mod" }, + /* 944 */ { ud_itab__944, UD_TAB__OPC_MOD, "/mod" }, + /* 945 */ { ud_itab__945, UD_TAB__OPC_MOD, "/mod" }, + /* 946 */ { ud_itab__946, UD_TAB__OPC_MOD, "/mod" }, + /* 947 */ { ud_itab__947, UD_TAB__OPC_MOD, "/mod" }, + /* 948 */ { ud_itab__948, UD_TAB__OPC_MOD, "/mod" }, + /* 949 */ { ud_itab__949, UD_TAB__OPC_X87, "/x87" }, + /* 950 */ { ud_itab__950, UD_TAB__OPC_MOD, "/mod" }, + /* 951 */ { ud_itab__951, UD_TAB__OPC_MOD, "/mod" }, + /* 952 */ { ud_itab__952, UD_TAB__OPC_MOD, "/mod" }, + /* 953 */ { ud_itab__953, UD_TAB__OPC_MOD, "/mod" }, + /* 954 */ { ud_itab__954, UD_TAB__OPC_MOD, "/mod" }, + /* 955 */ { ud_itab__955, UD_TAB__OPC_MOD, "/mod" }, + /* 956 */ { ud_itab__956, UD_TAB__OPC_MOD, "/mod" }, + /* 957 */ { ud_itab__957, UD_TAB__OPC_MOD, "/mod" }, + /* 958 */ { ud_itab__958, UD_TAB__OPC_MOD, "/mod" }, + /* 959 */ { ud_itab__959, UD_TAB__OPC_MOD, "/mod" }, + /* 960 */ { ud_itab__960, UD_TAB__OPC_MOD, "/mod" }, + /* 961 */ { ud_itab__961, UD_TAB__OPC_MOD, "/mod" }, + /* 962 */ { ud_itab__962, UD_TAB__OPC_MOD, "/mod" }, + /* 963 */ { ud_itab__963, UD_TAB__OPC_MOD, "/mod" }, + /* 964 */ { ud_itab__964, UD_TAB__OPC_MOD, "/mod" }, + /* 965 */ { ud_itab__965, UD_TAB__OPC_MOD, "/mod" }, + /* 966 */ { ud_itab__966, UD_TAB__OPC_MOD, "/mod" }, + /* 967 */ { ud_itab__967, UD_TAB__OPC_MOD, "/mod" }, + /* 968 */ { ud_itab__968, UD_TAB__OPC_MOD, "/mod" }, + /* 969 */ { ud_itab__969, UD_TAB__OPC_MOD, "/mod" }, + /* 970 */ { ud_itab__970, UD_TAB__OPC_MOD, "/mod" }, + /* 971 */ { ud_itab__971, UD_TAB__OPC_MOD, "/mod" }, + /* 972 */ { ud_itab__972, UD_TAB__OPC_MOD, "/mod" }, + /* 973 */ { ud_itab__973, UD_TAB__OPC_MOD, "/mod" }, + /* 974 */ { ud_itab__974, UD_TAB__OPC_MOD, "/mod" }, + /* 975 */ { ud_itab__975, UD_TAB__OPC_MOD, "/mod" }, + /* 976 */ { ud_itab__976, UD_TAB__OPC_MOD, "/mod" }, + /* 977 */ { ud_itab__977, UD_TAB__OPC_MOD, "/mod" }, + /* 978 */ { ud_itab__978, UD_TAB__OPC_MOD, "/mod" }, + /* 979 */ { ud_itab__979, UD_TAB__OPC_MOD, "/mod" }, + /* 980 */ { ud_itab__980, UD_TAB__OPC_MOD, "/mod" }, + /* 981 */ { ud_itab__981, UD_TAB__OPC_MOD, "/mod" }, + /* 982 */ { ud_itab__982, UD_TAB__OPC_MOD, "/mod" }, + /* 983 */ { ud_itab__983, UD_TAB__OPC_MOD, "/mod" }, + /* 984 */ { ud_itab__984, UD_TAB__OPC_MOD, "/mod" }, + /* 985 */ { ud_itab__985, UD_TAB__OPC_MOD, "/mod" }, + /* 986 */ { ud_itab__986, UD_TAB__OPC_MOD, "/mod" }, + /* 987 */ { ud_itab__987, UD_TAB__OPC_MOD, "/mod" }, + /* 988 */ { ud_itab__988, UD_TAB__OPC_MOD, "/mod" }, + /* 989 */ { ud_itab__989, UD_TAB__OPC_MOD, "/mod" }, + /* 990 */ { ud_itab__990, UD_TAB__OPC_MOD, "/mod" }, + /* 991 */ { ud_itab__991, UD_TAB__OPC_MOD, "/mod" }, + /* 992 */ { ud_itab__992, UD_TAB__OPC_MOD, "/mod" }, + /* 993 */ { ud_itab__993, UD_TAB__OPC_MOD, "/mod" }, + /* 994 */ { ud_itab__994, UD_TAB__OPC_MOD, "/mod" }, + /* 995 */ { ud_itab__995, UD_TAB__OPC_MOD, "/mod" }, + /* 996 */ { ud_itab__996, UD_TAB__OPC_MOD, "/mod" }, + /* 997 */ { ud_itab__997, UD_TAB__OPC_MOD, "/mod" }, + /* 998 */ { ud_itab__998, UD_TAB__OPC_MOD, "/mod" }, + /* 999 */ { ud_itab__999, UD_TAB__OPC_REG, "/reg" }, + /* 1000 */ { ud_itab__1000, UD_TAB__OPC_MOD, "/mod" }, + /* 1001 */ { ud_itab__1001, UD_TAB__OPC_MOD, "/mod" }, + /* 1002 */ { ud_itab__1002, UD_TAB__OPC_MOD, "/mod" }, + /* 1003 */ { ud_itab__1003, UD_TAB__OPC_MOD, "/mod" }, + /* 1004 */ { ud_itab__1004, UD_TAB__OPC_MOD, "/mod" }, + /* 1005 */ { ud_itab__1005, UD_TAB__OPC_MOD, "/mod" }, + /* 1006 */ { ud_itab__1006, UD_TAB__OPC_MOD, "/mod" }, + /* 1007 */ { ud_itab__1007, UD_TAB__OPC_MOD, "/mod" }, + /* 1008 */ { ud_itab__1008, UD_TAB__OPC_X87, "/x87" }, + /* 1009 */ { ud_itab__1009, UD_TAB__OPC_MOD, "/mod" }, + /* 1010 */ { ud_itab__1010, UD_TAB__OPC_MOD, "/mod" }, + /* 1011 */ { ud_itab__1011, UD_TAB__OPC_MOD, "/mod" }, + /* 1012 */ { ud_itab__1012, UD_TAB__OPC_MOD, "/mod" }, + /* 1013 */ { ud_itab__1013, UD_TAB__OPC_MOD, "/mod" }, + /* 1014 */ { ud_itab__1014, UD_TAB__OPC_MOD, "/mod" }, + /* 1015 */ { ud_itab__1015, UD_TAB__OPC_MOD, "/mod" }, + /* 1016 */ { ud_itab__1016, UD_TAB__OPC_MOD, "/mod" }, + /* 1017 */ { ud_itab__1017, UD_TAB__OPC_MOD, "/mod" }, + /* 1018 */ { ud_itab__1018, UD_TAB__OPC_MOD, "/mod" }, + /* 1019 */ { ud_itab__1019, UD_TAB__OPC_MOD, "/mod" }, + /* 1020 */ { ud_itab__1020, UD_TAB__OPC_MOD, "/mod" }, + /* 1021 */ { ud_itab__1021, UD_TAB__OPC_MOD, "/mod" }, + /* 1022 */ { ud_itab__1022, UD_TAB__OPC_MOD, "/mod" }, + /* 1023 */ { ud_itab__1023, UD_TAB__OPC_MOD, "/mod" }, + /* 1024 */ { ud_itab__1024, UD_TAB__OPC_MOD, "/mod" }, + /* 1025 */ { ud_itab__1025, UD_TAB__OPC_MOD, "/mod" }, + /* 1026 */ { ud_itab__1026, UD_TAB__OPC_MOD, "/mod" }, + /* 1027 */ { ud_itab__1027, UD_TAB__OPC_MOD, "/mod" }, + /* 1028 */ { ud_itab__1028, UD_TAB__OPC_MOD, "/mod" }, + /* 1029 */ { ud_itab__1029, UD_TAB__OPC_MOD, "/mod" }, + /* 1030 */ { ud_itab__1030, UD_TAB__OPC_MOD, "/mod" }, + /* 1031 */ { ud_itab__1031, UD_TAB__OPC_MOD, "/mod" }, + /* 1032 */ { ud_itab__1032, UD_TAB__OPC_MOD, "/mod" }, + /* 1033 */ { ud_itab__1033, UD_TAB__OPC_MOD, "/mod" }, + /* 1034 */ { ud_itab__1034, UD_TAB__OPC_MOD, "/mod" }, + /* 1035 */ { ud_itab__1035, UD_TAB__OPC_MOD, "/mod" }, + /* 1036 */ { ud_itab__1036, UD_TAB__OPC_MOD, "/mod" }, + /* 1037 */ { ud_itab__1037, UD_TAB__OPC_MOD, "/mod" }, + /* 1038 */ { ud_itab__1038, UD_TAB__OPC_MOD, "/mod" }, + /* 1039 */ { ud_itab__1039, UD_TAB__OPC_MOD, "/mod" }, + /* 1040 */ { ud_itab__1040, UD_TAB__OPC_MOD, "/mod" }, + /* 1041 */ { ud_itab__1041, UD_TAB__OPC_MOD, "/mod" }, + /* 1042 */ { ud_itab__1042, UD_TAB__OPC_MOD, "/mod" }, + /* 1043 */ { ud_itab__1043, UD_TAB__OPC_MOD, "/mod" }, + /* 1044 */ { ud_itab__1044, UD_TAB__OPC_MOD, "/mod" }, + /* 1045 */ { ud_itab__1045, UD_TAB__OPC_MOD, "/mod" }, + /* 1046 */ { ud_itab__1046, UD_TAB__OPC_MOD, "/mod" }, + /* 1047 */ { ud_itab__1047, UD_TAB__OPC_MOD, "/mod" }, + /* 1048 */ { ud_itab__1048, UD_TAB__OPC_MOD, "/mod" }, + /* 1049 */ { ud_itab__1049, UD_TAB__OPC_MOD, "/mod" }, + /* 1050 */ { ud_itab__1050, UD_TAB__OPC_MOD, "/mod" }, + /* 1051 */ { ud_itab__1051, UD_TAB__OPC_MOD, "/mod" }, + /* 1052 */ { ud_itab__1052, UD_TAB__OPC_MOD, "/mod" }, + /* 1053 */ { ud_itab__1053, UD_TAB__OPC_MOD, "/mod" }, + /* 1054 */ { ud_itab__1054, UD_TAB__OPC_MOD, "/mod" }, + /* 1055 */ { ud_itab__1055, UD_TAB__OPC_MOD, "/mod" }, + /* 1056 */ { ud_itab__1056, UD_TAB__OPC_MOD, "/mod" }, + /* 1057 */ { ud_itab__1057, UD_TAB__OPC_MOD, "/mod" }, + /* 1058 */ { ud_itab__1058, UD_TAB__OPC_MOD, "/mod" }, + /* 1059 */ { ud_itab__1059, UD_TAB__OPC_MOD, "/mod" }, + /* 1060 */ { ud_itab__1060, UD_TAB__OPC_MOD, "/mod" }, + /* 1061 */ { ud_itab__1061, UD_TAB__OPC_MOD, "/mod" }, + /* 1062 */ { ud_itab__1062, UD_TAB__OPC_MOD, "/mod" }, + /* 1063 */ { ud_itab__1063, UD_TAB__OPC_MOD, "/mod" }, + /* 1064 */ { ud_itab__1064, UD_TAB__OPC_MOD, "/mod" }, + /* 1065 */ { ud_itab__1065, UD_TAB__OPC_MOD, "/mod" }, + /* 1066 */ { ud_itab__1066, UD_TAB__OPC_MOD, "/mod" }, + /* 1067 */ { ud_itab__1067, UD_TAB__OPC_REG, "/reg" }, + /* 1068 */ { ud_itab__1068, UD_TAB__OPC_MOD, "/mod" }, + /* 1069 */ { ud_itab__1069, UD_TAB__OPC_MOD, "/mod" }, + /* 1070 */ { ud_itab__1070, UD_TAB__OPC_MOD, "/mod" }, + /* 1071 */ { ud_itab__1071, UD_TAB__OPC_MOD, "/mod" }, + /* 1072 */ { ud_itab__1072, UD_TAB__OPC_MOD, "/mod" }, + /* 1073 */ { ud_itab__1073, UD_TAB__OPC_MOD, "/mod" }, + /* 1074 */ { ud_itab__1074, UD_TAB__OPC_MOD, "/mod" }, + /* 1075 */ { ud_itab__1075, UD_TAB__OPC_MOD, "/mod" }, + /* 1076 */ { ud_itab__1076, UD_TAB__OPC_X87, "/x87" }, + /* 1077 */ { ud_itab__1077, UD_TAB__OPC_MOD, "/mod" }, + /* 1078 */ { ud_itab__1078, UD_TAB__OPC_MOD, "/mod" }, + /* 1079 */ { ud_itab__1079, UD_TAB__OPC_MOD, "/mod" }, + /* 1080 */ { ud_itab__1080, UD_TAB__OPC_MOD, "/mod" }, + /* 1081 */ { ud_itab__1081, UD_TAB__OPC_MOD, "/mod" }, + /* 1082 */ { ud_itab__1082, UD_TAB__OPC_MOD, "/mod" }, + /* 1083 */ { ud_itab__1083, UD_TAB__OPC_MOD, "/mod" }, + /* 1084 */ { ud_itab__1084, UD_TAB__OPC_MOD, "/mod" }, + /* 1085 */ { ud_itab__1085, UD_TAB__OPC_MOD, "/mod" }, + /* 1086 */ { ud_itab__1086, UD_TAB__OPC_MOD, "/mod" }, + /* 1087 */ { ud_itab__1087, UD_TAB__OPC_MOD, "/mod" }, + /* 1088 */ { ud_itab__1088, UD_TAB__OPC_MOD, "/mod" }, + /* 1089 */ { ud_itab__1089, UD_TAB__OPC_MOD, "/mod" }, + /* 1090 */ { ud_itab__1090, UD_TAB__OPC_MOD, "/mod" }, + /* 1091 */ { ud_itab__1091, UD_TAB__OPC_MOD, "/mod" }, + /* 1092 */ { ud_itab__1092, UD_TAB__OPC_MOD, "/mod" }, + /* 1093 */ { ud_itab__1093, UD_TAB__OPC_MOD, "/mod" }, + /* 1094 */ { ud_itab__1094, UD_TAB__OPC_MOD, "/mod" }, + /* 1095 */ { ud_itab__1095, UD_TAB__OPC_MOD, "/mod" }, + /* 1096 */ { ud_itab__1096, UD_TAB__OPC_MOD, "/mod" }, + /* 1097 */ { ud_itab__1097, UD_TAB__OPC_MOD, "/mod" }, + /* 1098 */ { ud_itab__1098, UD_TAB__OPC_MOD, "/mod" }, + /* 1099 */ { ud_itab__1099, UD_TAB__OPC_MOD, "/mod" }, + /* 1100 */ { ud_itab__1100, UD_TAB__OPC_MOD, "/mod" }, + /* 1101 */ { ud_itab__1101, UD_TAB__OPC_MOD, "/mod" }, + /* 1102 */ { ud_itab__1102, UD_TAB__OPC_MOD, "/mod" }, + /* 1103 */ { ud_itab__1103, UD_TAB__OPC_MOD, "/mod" }, + /* 1104 */ { ud_itab__1104, UD_TAB__OPC_MOD, "/mod" }, + /* 1105 */ { ud_itab__1105, UD_TAB__OPC_MOD, "/mod" }, + /* 1106 */ { ud_itab__1106, UD_TAB__OPC_MOD, "/mod" }, + /* 1107 */ { ud_itab__1107, UD_TAB__OPC_MOD, "/mod" }, + /* 1108 */ { ud_itab__1108, UD_TAB__OPC_MOD, "/mod" }, + /* 1109 */ { ud_itab__1109, UD_TAB__OPC_MOD, "/mod" }, + /* 1110 */ { ud_itab__1110, UD_TAB__OPC_MOD, "/mod" }, + /* 1111 */ { ud_itab__1111, UD_TAB__OPC_MOD, "/mod" }, + /* 1112 */ { ud_itab__1112, UD_TAB__OPC_MOD, "/mod" }, + /* 1113 */ { ud_itab__1113, UD_TAB__OPC_MOD, "/mod" }, + /* 1114 */ { ud_itab__1114, UD_TAB__OPC_MOD, "/mod" }, + /* 1115 */ { ud_itab__1115, UD_TAB__OPC_MOD, "/mod" }, + /* 1116 */ { ud_itab__1116, UD_TAB__OPC_MOD, "/mod" }, + /* 1117 */ { ud_itab__1117, UD_TAB__OPC_MOD, "/mod" }, + /* 1118 */ { ud_itab__1118, UD_TAB__OPC_MOD, "/mod" }, + /* 1119 */ { ud_itab__1119, UD_TAB__OPC_MOD, "/mod" }, + /* 1120 */ { ud_itab__1120, UD_TAB__OPC_MOD, "/mod" }, + /* 1121 */ { ud_itab__1121, UD_TAB__OPC_MOD, "/mod" }, + /* 1122 */ { ud_itab__1122, UD_TAB__OPC_MOD, "/mod" }, + /* 1123 */ { ud_itab__1123, UD_TAB__OPC_MOD, "/mod" }, + /* 1124 */ { ud_itab__1124, UD_TAB__OPC_MOD, "/mod" }, + /* 1125 */ { ud_itab__1125, UD_TAB__OPC_MOD, "/mod" }, + /* 1126 */ { ud_itab__1126, UD_TAB__OPC_ASIZE, "/a" }, + /* 1127 */ { ud_itab__1127, UD_TAB__OPC_MODE, "/m" }, + /* 1128 */ { ud_itab__1128, UD_TAB__OPC_REG, "/reg" }, + /* 1129 */ { ud_itab__1129, UD_TAB__OPC_REG, "/reg" }, + /* 1130 */ { ud_itab__1130, UD_TAB__OPC_REG, "/reg" }, + /* 1131 */ { ud_itab__1131, UD_TAB__OPC_REG, "/reg" }, + /* 1132 */ { ud_itab__1132, UD_TAB__OPC_MODE, "/m" }, +}; + +/* itab entry operand definitions (for readability) */ +#define O_AL { OP_AL, SZ_B } +#define O_AX { OP_AX, SZ_W } +#define O_Av { OP_A, SZ_V } +#define O_C { OP_C, SZ_NA } +#define O_CL { OP_CL, SZ_B } +#define O_CS { OP_CS, SZ_NA } +#define O_CX { OP_CX, SZ_W } +#define O_D { OP_D, SZ_NA } +#define O_DL { OP_DL, SZ_B } +#define O_DS { OP_DS, SZ_NA } +#define O_DX { OP_DX, SZ_W } +#define O_E { OP_E, SZ_NA } +#define O_ES { OP_ES, SZ_NA } +#define O_Eb { OP_E, SZ_B } +#define O_Ed { OP_E, SZ_D } +#define O_Eq { OP_E, SZ_Q } +#define O_Ev { OP_E, SZ_V } +#define O_Ew { OP_E, SZ_W } +#define O_Ey { OP_E, SZ_Y } +#define O_Ez { OP_E, SZ_Z } +#define O_FS { OP_FS, SZ_NA } +#define O_Fv { OP_F, SZ_V } +#define O_G { OP_G, SZ_NA } +#define O_GS { OP_GS, SZ_NA } +#define O_Gb { OP_G, SZ_B } +#define O_Gd { OP_G, SZ_D } +#define O_Gq { OP_G, SZ_Q } +#define O_Gv { OP_G, SZ_V } +#define O_Gw { OP_G, SZ_W } +#define O_Gy { OP_G, SZ_Y } +#define O_Gz { OP_G, SZ_Z } +#define O_I1 { OP_I1, SZ_NA } +#define O_I3 { OP_I3, SZ_NA } +#define O_Ib { OP_I, SZ_B } +#define O_Iv { OP_I, SZ_V } +#define O_Iw { OP_I, SZ_W } +#define O_Iz { OP_I, SZ_Z } +#define O_Jb { OP_J, SZ_B } +#define O_Jv { OP_J, SZ_V } +#define O_Jz { OP_J, SZ_Z } +#define O_M { OP_M, SZ_NA } +#define O_Mb { OP_M, SZ_B } +#define O_MbRd { OP_MR, SZ_BD } +#define O_MbRv { OP_MR, SZ_BV } +#define O_Md { OP_M, SZ_D } +#define O_MdRy { OP_MR, SZ_DY } +#define O_MdU { OP_MU, SZ_DO } +#define O_Mo { OP_M, SZ_O } +#define O_Mq { OP_M, SZ_Q } +#define O_MqU { OP_MU, SZ_QO } +#define O_Ms { OP_M, SZ_W } +#define O_Mt { OP_M, SZ_T } +#define O_Mv { OP_M, SZ_V } +#define O_Mw { OP_M, SZ_W } +#define O_MwRd { OP_MR, SZ_WD } +#define O_MwRv { OP_MR, SZ_WV } +#define O_MwRy { OP_MR, SZ_WY } +#define O_MwU { OP_MU, SZ_WO } +#define O_N { OP_N, SZ_Q } +#define O_NONE { OP_NONE, SZ_NA } +#define O_Ob { OP_O, SZ_B } +#define O_Ov { OP_O, SZ_V } +#define O_Ow { OP_O, SZ_W } +#define O_P { OP_P, SZ_Q } +#define O_Q { OP_Q, SZ_Q } +#define O_R { OP_R, SZ_RDQ } +#define O_R0b { OP_R0, SZ_B } +#define O_R0v { OP_R0, SZ_V } +#define O_R0w { OP_R0, SZ_W } +#define O_R0y { OP_R0, SZ_Y } +#define O_R0z { OP_R0, SZ_Z } +#define O_R1b { OP_R1, SZ_B } +#define O_R1v { OP_R1, SZ_V } +#define O_R1w { OP_R1, SZ_W } +#define O_R1y { OP_R1, SZ_Y } +#define O_R1z { OP_R1, SZ_Z } +#define O_R2b { OP_R2, SZ_B } +#define O_R2v { OP_R2, SZ_V } +#define O_R2w { OP_R2, SZ_W } +#define O_R2y { OP_R2, SZ_Y } +#define O_R2z { OP_R2, SZ_Z } +#define O_R3b { OP_R3, SZ_B } +#define O_R3v { OP_R3, SZ_V } +#define O_R3w { OP_R3, SZ_W } +#define O_R3y { OP_R3, SZ_Y } +#define O_R3z { OP_R3, SZ_Z } +#define O_R4b { OP_R4, SZ_B } +#define O_R4v { OP_R4, SZ_V } +#define O_R4w { OP_R4, SZ_W } +#define O_R4y { OP_R4, SZ_Y } +#define O_R4z { OP_R4, SZ_Z } +#define O_R5b { OP_R5, SZ_B } +#define O_R5v { OP_R5, SZ_V } +#define O_R5w { OP_R5, SZ_W } +#define O_R5y { OP_R5, SZ_Y } +#define O_R5z { OP_R5, SZ_Z } +#define O_R6b { OP_R6, SZ_B } +#define O_R6v { OP_R6, SZ_V } +#define O_R6w { OP_R6, SZ_W } +#define O_R6y { OP_R6, SZ_Y } +#define O_R6z { OP_R6, SZ_Z } +#define O_R7b { OP_R7, SZ_B } +#define O_R7v { OP_R7, SZ_V } +#define O_R7w { OP_R7, SZ_W } +#define O_R7y { OP_R7, SZ_Y } +#define O_R7z { OP_R7, SZ_Z } +#define O_S { OP_S, SZ_NA } +#define O_SS { OP_SS, SZ_NA } +#define O_ST0 { OP_ST0, SZ_NA } +#define O_ST1 { OP_ST1, SZ_NA } +#define O_ST2 { OP_ST2, SZ_NA } +#define O_ST3 { OP_ST3, SZ_NA } +#define O_ST4 { OP_ST4, SZ_NA } +#define O_ST5 { OP_ST5, SZ_NA } +#define O_ST6 { OP_ST6, SZ_NA } +#define O_ST7 { OP_ST7, SZ_NA } +#define O_U { OP_U, SZ_O } +#define O_V { OP_V, SZ_O } +#define O_W { OP_W, SZ_O } +#define O_eAX { OP_eAX, SZ_Z } +#define O_eCX { OP_eCX, SZ_Z } +#define O_eDX { OP_eDX, SZ_Z } +#define O_rAX { OP_rAX, SZ_V } +#define O_rCX { OP_rCX, SZ_V } +#define O_rDX { OP_rDX, SZ_V } +#define O_sIb { OP_sI, SZ_B } +#define O_sIv { OP_sI, SZ_V } +#define O_sIz { OP_sI, SZ_Z } + +struct ud_itab_entry ud_itab[] = { + /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none }, + /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0003 */ { UD_Iadd, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0004 */ { UD_Iadd, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0005 */ { UD_Iadd, O_AL, O_Ib, O_NONE, P_none }, + /* 0006 */ { UD_Iadd, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0007 */ { UD_Ipush, O_ES, O_NONE, O_NONE, P_inv64 }, + /* 0008 */ { UD_Ipop, O_ES, O_NONE, O_NONE, P_inv64 }, + /* 0009 */ { UD_Ior, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0010 */ { UD_Ior, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0011 */ { UD_Ior, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0012 */ { UD_Ior, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0013 */ { UD_Ior, O_AL, O_Ib, O_NONE, P_none }, + /* 0014 */ { UD_Ior, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0015 */ { UD_Ipush, O_CS, O_NONE, O_NONE, P_inv64 }, + /* 0016 */ { UD_Isldt, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0017 */ { UD_Istr, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0018 */ { UD_Illdt, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0019 */ { UD_Iltr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0020 */ { UD_Iverr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0021 */ { UD_Iverw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0022 */ { UD_Isgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0023 */ { UD_Isidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0024 */ { UD_Ilgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0025 */ { UD_Ilidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0026 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0027 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0028 */ { UD_Iinvlpg, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0029 */ { UD_Ivmcall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0030 */ { UD_Ivmlaunch, O_NONE, O_NONE, O_NONE, P_none }, + /* 0031 */ { UD_Ivmresume, O_NONE, O_NONE, O_NONE, P_none }, + /* 0032 */ { UD_Ivmxoff, O_NONE, O_NONE, O_NONE, P_none }, + /* 0033 */ { UD_Imonitor, O_NONE, O_NONE, O_NONE, P_none }, + /* 0034 */ { UD_Imwait, O_NONE, O_NONE, O_NONE, P_none }, + /* 0035 */ { UD_Ixgetbv, O_NONE, O_NONE, O_NONE, P_none }, + /* 0036 */ { UD_Ixsetbv, O_NONE, O_NONE, O_NONE, P_none }, + /* 0037 */ { UD_Ivmrun, O_NONE, O_NONE, O_NONE, P_none }, + /* 0038 */ { UD_Ivmmcall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0039 */ { UD_Ivmload, O_NONE, O_NONE, O_NONE, P_none }, + /* 0040 */ { UD_Ivmsave, O_NONE, O_NONE, O_NONE, P_none }, + /* 0041 */ { UD_Istgi, O_NONE, O_NONE, O_NONE, P_none }, + /* 0042 */ { UD_Iclgi, O_NONE, O_NONE, O_NONE, P_none }, + /* 0043 */ { UD_Iskinit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0044 */ { UD_Iinvlpga, O_NONE, O_NONE, O_NONE, P_none }, + /* 0045 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0046 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0047 */ { UD_Iswapgs, O_NONE, O_NONE, O_NONE, P_none }, + /* 0048 */ { UD_Irdtscp, O_NONE, O_NONE, O_NONE, P_none }, + /* 0049 */ { UD_Ilar, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0050 */ { UD_Ilsl, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0051 */ { UD_Isyscall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0052 */ { UD_Iclts, O_NONE, O_NONE, O_NONE, P_none }, + /* 0053 */ { UD_Isysret, O_NONE, O_NONE, O_NONE, P_none }, + /* 0054 */ { UD_Iinvd, O_NONE, O_NONE, O_NONE, P_none }, + /* 0055 */ { UD_Iwbinvd, O_NONE, O_NONE, O_NONE, P_none }, + /* 0056 */ { UD_Iud2, O_NONE, O_NONE, O_NONE, P_none }, + /* 0057 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0058 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0059 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0060 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0061 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0062 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0063 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0064 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0065 */ { UD_Ifemms, O_NONE, O_NONE, O_NONE, P_none }, + /* 0066 */ { UD_Ipi2fw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0067 */ { UD_Ipi2fd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0068 */ { UD_Ipf2iw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0069 */ { UD_Ipf2id, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0070 */ { UD_Ipfnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0071 */ { UD_Ipfpnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0072 */ { UD_Ipfcmpge, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0073 */ { UD_Ipfmin, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0074 */ { UD_Ipfrcp, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0075 */ { UD_Ipfrsqrt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0076 */ { UD_Ipfsub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0077 */ { UD_Ipfadd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0078 */ { UD_Ipfcmpgt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0079 */ { UD_Ipfmax, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0080 */ { UD_Ipfrcpit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0081 */ { UD_Ipfrsqit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0082 */ { UD_Ipfsubr, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0083 */ { UD_Ipfacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0084 */ { UD_Ipfcmpeq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0085 */ { UD_Ipfmul, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0086 */ { UD_Ipfrcpit2, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0087 */ { UD_Ipmulhrw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0088 */ { UD_Ipswapd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0089 */ { UD_Ipavgusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0090 */ { UD_Imovups, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0091 */ { UD_Imovsd, O_V, O_W, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, + /* 0092 */ { UD_Imovss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0093 */ { UD_Imovupd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0094 */ { UD_Imovups, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0095 */ { UD_Imovsd, O_W, O_V, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, + /* 0096 */ { UD_Imovss, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0097 */ { UD_Imovupd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0098 */ { UD_Imovlps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0099 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0100 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0101 */ { UD_Imovlpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0102 */ { UD_Imovhlps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0103 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0104 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0105 */ { UD_Imovlps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0106 */ { UD_Imovlpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0107 */ { UD_Iunpcklps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0108 */ { UD_Iunpcklpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0109 */ { UD_Iunpckhps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0110 */ { UD_Iunpckhpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0111 */ { UD_Imovhps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0112 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0113 */ { UD_Imovhpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0114 */ { UD_Imovlhps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0115 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0116 */ { UD_Imovhps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0117 */ { UD_Imovhpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0118 */ { UD_Iprefetchnta, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0119 */ { UD_Iprefetcht0, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0120 */ { UD_Iprefetcht1, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0121 */ { UD_Iprefetcht2, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0122 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0123 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0124 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0125 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0126 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0127 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0128 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0129 */ { UD_Imov, O_R, O_C, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0130 */ { UD_Imov, O_R, O_D, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0131 */ { UD_Imov, O_C, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0132 */ { UD_Imov, O_D, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0133 */ { UD_Imovaps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0134 */ { UD_Imovapd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0135 */ { UD_Imovaps, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0136 */ { UD_Imovapd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0137 */ { UD_Icvtpi2ps, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0138 */ { UD_Icvtsi2sd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0139 */ { UD_Icvtsi2ss, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0140 */ { UD_Icvtpi2pd, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0141 */ { UD_Imovntps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0142 */ { UD_Imovntpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0143 */ { UD_Icvttps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0144 */ { UD_Icvttsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0145 */ { UD_Icvttss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0146 */ { UD_Icvttpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0147 */ { UD_Icvtps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0148 */ { UD_Icvtsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0149 */ { UD_Icvtss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0150 */ { UD_Icvtpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0151 */ { UD_Iucomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0152 */ { UD_Iucomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0153 */ { UD_Icomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0154 */ { UD_Icomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0155 */ { UD_Iwrmsr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0156 */ { UD_Irdtsc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0157 */ { UD_Irdmsr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0158 */ { UD_Irdpmc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0159 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, + /* 0160 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, + /* 0161 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0162 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0163 */ { UD_Igetsec, O_NONE, O_NONE, O_NONE, P_none }, + /* 0164 */ { UD_Ipshufb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0165 */ { UD_Ipshufb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0166 */ { UD_Iphaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0167 */ { UD_Iphaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0168 */ { UD_Iphaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0169 */ { UD_Iphaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0170 */ { UD_Iphaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0171 */ { UD_Iphaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0172 */ { UD_Ipmaddubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0173 */ { UD_Ipmaddubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0174 */ { UD_Iphsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0175 */ { UD_Iphsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0176 */ { UD_Iphsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0177 */ { UD_Iphsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0178 */ { UD_Iphsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0179 */ { UD_Iphsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0180 */ { UD_Ipsignb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0181 */ { UD_Ipsignb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0182 */ { UD_Ipsignw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0183 */ { UD_Ipsignw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0184 */ { UD_Ipsignd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0185 */ { UD_Ipsignd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0186 */ { UD_Ipmulhrsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0187 */ { UD_Ipmulhrsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0188 */ { UD_Ipblendvb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0189 */ { UD_Iblendvps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0190 */ { UD_Iblendvpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0191 */ { UD_Iptest, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0192 */ { UD_Ipabsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0193 */ { UD_Ipabsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0194 */ { UD_Ipabsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0195 */ { UD_Ipabsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0196 */ { UD_Ipabsd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0197 */ { UD_Ipabsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0198 */ { UD_Ipmovsxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0199 */ { UD_Ipmovsxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0200 */ { UD_Ipmovsxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0201 */ { UD_Ipmovsxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0202 */ { UD_Ipmovsxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0203 */ { UD_Ipmovsxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0204 */ { UD_Ipmuldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0205 */ { UD_Ipcmpeqq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0206 */ { UD_Imovntdqa, O_V, O_Mo, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0207 */ { UD_Ipackusdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0208 */ { UD_Ipmovzxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0209 */ { UD_Ipmovzxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0210 */ { UD_Ipmovzxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0211 */ { UD_Ipmovzxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0212 */ { UD_Ipmovzxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0213 */ { UD_Ipmovzxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0214 */ { UD_Ipcmpgtq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0215 */ { UD_Ipminsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0216 */ { UD_Ipminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0217 */ { UD_Ipminuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0218 */ { UD_Ipminud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0219 */ { UD_Ipmaxsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0220 */ { UD_Ipmaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0221 */ { UD_Ipmaxuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0222 */ { UD_Ipmaxud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0223 */ { UD_Ipmulld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0224 */ { UD_Iphminposuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0225 */ { UD_Iinvept, O_Gq, O_Mo, O_NONE, P_none }, + /* 0226 */ { UD_Iinvvpid, O_Gq, O_Mo, O_NONE, P_none }, + /* 0227 */ { UD_Iaesimc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0228 */ { UD_Iaesenc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0229 */ { UD_Iaesenclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0230 */ { UD_Iaesdec, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0231 */ { UD_Iaesdeclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0232 */ { UD_Imovbe, O_Gv, O_Mv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0233 */ { UD_Icrc32, O_Gy, O_Eb, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0234 */ { UD_Imovbe, O_Mv, O_Gv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0235 */ { UD_Icrc32, O_Gy, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0236 */ { UD_Iroundps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0237 */ { UD_Iroundpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0238 */ { UD_Iroundss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0239 */ { UD_Iroundsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0240 */ { UD_Iblendps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0241 */ { UD_Iblendpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0242 */ { UD_Ipblendw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0243 */ { UD_Ipalignr, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0244 */ { UD_Ipalignr, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0245 */ { UD_Ipextrb, O_MbRv, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb|P_def64 }, + /* 0246 */ { UD_Ipextrw, O_MwRd, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb }, + /* 0247 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, + /* 0248 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, + /* 0249 */ { UD_Ipextrq, O_Eq, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexb|P_def64 }, + /* 0250 */ { UD_Iextractps, O_MdRy, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0251 */ { UD_Ipinsrb, O_V, O_MbRd, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0252 */ { UD_Iinsertps, O_V, O_Md, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0253 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0254 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0255 */ { UD_Ipinsrq, O_V, O_Eq, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0256 */ { UD_Idpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0257 */ { UD_Idppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0258 */ { UD_Impsadbw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0259 */ { UD_Ipclmulqdq, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0260 */ { UD_Ipcmpestrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0261 */ { UD_Ipcmpestri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0262 */ { UD_Ipcmpistrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0263 */ { UD_Ipcmpistri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0264 */ { UD_Iaeskeygenassist, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0265 */ { UD_Icmovo, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0266 */ { UD_Icmovno, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0267 */ { UD_Icmovb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0268 */ { UD_Icmovae, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0269 */ { UD_Icmovz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0270 */ { UD_Icmovnz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0271 */ { UD_Icmovbe, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0272 */ { UD_Icmova, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0273 */ { UD_Icmovs, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0274 */ { UD_Icmovns, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0275 */ { UD_Icmovp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0276 */ { UD_Icmovnp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0277 */ { UD_Icmovl, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0278 */ { UD_Icmovge, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0279 */ { UD_Icmovle, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0280 */ { UD_Icmovg, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0281 */ { UD_Imovmskps, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0282 */ { UD_Imovmskpd, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0283 */ { UD_Isqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0284 */ { UD_Isqrtsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0285 */ { UD_Isqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0286 */ { UD_Isqrtpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0287 */ { UD_Irsqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0288 */ { UD_Irsqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0289 */ { UD_Ircpps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0290 */ { UD_Ircpss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0291 */ { UD_Iandps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0292 */ { UD_Iandpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0293 */ { UD_Iandnps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0294 */ { UD_Iandnpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0295 */ { UD_Iorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0296 */ { UD_Iorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0297 */ { UD_Ixorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0298 */ { UD_Ixorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0299 */ { UD_Iaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0300 */ { UD_Iaddsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0301 */ { UD_Iaddss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0302 */ { UD_Iaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0303 */ { UD_Imulps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0304 */ { UD_Imulsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0305 */ { UD_Imulss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0306 */ { UD_Imulpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0307 */ { UD_Icvtps2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0308 */ { UD_Icvtsd2ss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0309 */ { UD_Icvtss2sd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0310 */ { UD_Icvtpd2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0311 */ { UD_Icvtdq2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0312 */ { UD_Icvttps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0313 */ { UD_Icvtps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0314 */ { UD_Isubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0315 */ { UD_Isubsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0316 */ { UD_Isubss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0317 */ { UD_Isubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0318 */ { UD_Iminps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0319 */ { UD_Iminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0320 */ { UD_Iminss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0321 */ { UD_Iminpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0322 */ { UD_Idivps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0323 */ { UD_Idivsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0324 */ { UD_Idivss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0325 */ { UD_Idivpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0326 */ { UD_Imaxps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0327 */ { UD_Imaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0328 */ { UD_Imaxss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0329 */ { UD_Imaxpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0330 */ { UD_Ipunpcklbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0331 */ { UD_Ipunpcklbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0332 */ { UD_Ipunpcklwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0333 */ { UD_Ipunpcklwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0334 */ { UD_Ipunpckldq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0335 */ { UD_Ipunpckldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0336 */ { UD_Ipacksswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0337 */ { UD_Ipacksswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0338 */ { UD_Ipcmpgtb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0339 */ { UD_Ipcmpgtb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0340 */ { UD_Ipcmpgtw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0341 */ { UD_Ipcmpgtw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0342 */ { UD_Ipcmpgtd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0343 */ { UD_Ipcmpgtd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0344 */ { UD_Ipackuswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0345 */ { UD_Ipackuswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0346 */ { UD_Ipunpckhbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0347 */ { UD_Ipunpckhbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0348 */ { UD_Ipunpckhwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0349 */ { UD_Ipunpckhwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0350 */ { UD_Ipunpckhdq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0351 */ { UD_Ipunpckhdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0352 */ { UD_Ipackssdw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0353 */ { UD_Ipackssdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0354 */ { UD_Ipunpcklqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0355 */ { UD_Ipunpckhqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0356 */ { UD_Imovd, O_P, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0357 */ { UD_Imovd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0358 */ { UD_Imovq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0359 */ { UD_Imovdqu, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0360 */ { UD_Imovdqa, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0361 */ { UD_Ipshufw, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0362 */ { UD_Ipshuflw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0363 */ { UD_Ipshufhw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0364 */ { UD_Ipshufd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0365 */ { UD_Ipsrlw, O_N, O_Ib, O_NONE, P_none }, + /* 0366 */ { UD_Ipsrlw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0367 */ { UD_Ipsraw, O_N, O_Ib, O_NONE, P_none }, + /* 0368 */ { UD_Ipsraw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0369 */ { UD_Ipsllw, O_N, O_Ib, O_NONE, P_none }, + /* 0370 */ { UD_Ipsllw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0371 */ { UD_Ipsrld, O_N, O_Ib, O_NONE, P_none }, + /* 0372 */ { UD_Ipsrld, O_U, O_Ib, O_NONE, P_rexb }, + /* 0373 */ { UD_Ipsrad, O_N, O_Ib, O_NONE, P_none }, + /* 0374 */ { UD_Ipsrad, O_U, O_Ib, O_NONE, P_rexb }, + /* 0375 */ { UD_Ipslld, O_N, O_Ib, O_NONE, P_none }, + /* 0376 */ { UD_Ipslld, O_U, O_Ib, O_NONE, P_rexb }, + /* 0377 */ { UD_Ipsrlq, O_N, O_Ib, O_NONE, P_none }, + /* 0378 */ { UD_Ipsrlq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0379 */ { UD_Ipsrldq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0380 */ { UD_Ipsllq, O_N, O_Ib, O_NONE, P_none }, + /* 0381 */ { UD_Ipsllq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0382 */ { UD_Ipslldq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0383 */ { UD_Ipcmpeqb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0384 */ { UD_Ipcmpeqb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0385 */ { UD_Ipcmpeqw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0386 */ { UD_Ipcmpeqw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0387 */ { UD_Ipcmpeqd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0388 */ { UD_Ipcmpeqd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0389 */ { UD_Iemms, O_NONE, O_NONE, O_NONE, P_none }, + /* 0390 */ { UD_Ivmread, O_Ey, O_Gy, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0391 */ { UD_Ivmwrite, O_Gy, O_Ey, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0392 */ { UD_Ihaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0393 */ { UD_Ihaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0394 */ { UD_Ihsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0395 */ { UD_Ihsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0396 */ { UD_Imovd, O_Ey, O_P, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0397 */ { UD_Imovq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0398 */ { UD_Imovd, O_Ey, O_V, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0399 */ { UD_Imovq, O_Q, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0400 */ { UD_Imovdqu, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0401 */ { UD_Imovdqa, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0402 */ { UD_Ijo, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0403 */ { UD_Ijno, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0404 */ { UD_Ijb, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0405 */ { UD_Ijae, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0406 */ { UD_Ijz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0407 */ { UD_Ijnz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0408 */ { UD_Ijbe, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0409 */ { UD_Ija, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0410 */ { UD_Ijs, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0411 */ { UD_Ijns, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0412 */ { UD_Ijp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0413 */ { UD_Ijnp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0414 */ { UD_Ijl, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0415 */ { UD_Ijge, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0416 */ { UD_Ijle, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0417 */ { UD_Ijg, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0418 */ { UD_Iseto, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0419 */ { UD_Isetno, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0420 */ { UD_Isetb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0421 */ { UD_Isetae, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0422 */ { UD_Isetz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0423 */ { UD_Isetnz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0424 */ { UD_Isetbe, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0425 */ { UD_Iseta, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0426 */ { UD_Isets, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0427 */ { UD_Isetns, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0428 */ { UD_Isetp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0429 */ { UD_Isetnp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0430 */ { UD_Isetl, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0431 */ { UD_Isetge, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0432 */ { UD_Isetle, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0433 */ { UD_Isetg, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0434 */ { UD_Ipush, O_FS, O_NONE, O_NONE, P_none }, + /* 0435 */ { UD_Ipop, O_FS, O_NONE, O_NONE, P_none }, + /* 0436 */ { UD_Icpuid, O_NONE, O_NONE, O_NONE, P_none }, + /* 0437 */ { UD_Ibt, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0438 */ { UD_Ishld, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0439 */ { UD_Ishld, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0440 */ { UD_Imontmul, O_NONE, O_NONE, O_NONE, P_none }, + /* 0441 */ { UD_Ixsha1, O_NONE, O_NONE, O_NONE, P_none }, + /* 0442 */ { UD_Ixsha256, O_NONE, O_NONE, O_NONE, P_none }, + /* 0443 */ { UD_Ixstore, O_NONE, O_NONE, O_NONE, P_none }, + /* 0444 */ { UD_Ixcryptecb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0445 */ { UD_Ixcryptcbc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0446 */ { UD_Ixcryptctr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0447 */ { UD_Ixcryptcfb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0448 */ { UD_Ixcryptofb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0449 */ { UD_Ipush, O_GS, O_NONE, O_NONE, P_none }, + /* 0450 */ { UD_Ipop, O_GS, O_NONE, O_NONE, P_none }, + /* 0451 */ { UD_Irsm, O_NONE, O_NONE, O_NONE, P_none }, + /* 0452 */ { UD_Ibts, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0453 */ { UD_Ishrd, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0454 */ { UD_Ishrd, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0455 */ { UD_Ifxsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0456 */ { UD_Ifxrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0457 */ { UD_Ildmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0458 */ { UD_Istmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0459 */ { UD_Ixsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0460 */ { UD_Ixrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0461 */ { UD_Iclflush, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0462 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0463 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0464 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0465 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0466 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0467 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0468 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0469 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0470 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0471 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0472 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0473 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0474 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0475 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0476 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0477 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0478 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0479 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0480 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0481 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0482 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0483 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0484 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0485 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0486 */ { UD_Iimul, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0487 */ { UD_Icmpxchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0488 */ { UD_Icmpxchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0489 */ { UD_Ilss, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0490 */ { UD_Ibtr, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0491 */ { UD_Ilfs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0492 */ { UD_Ilgs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0493 */ { UD_Imovzx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0494 */ { UD_Imovzx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0495 */ { UD_Ipopcnt, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0496 */ { UD_Ibt, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0497 */ { UD_Ibts, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0498 */ { UD_Ibtr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0499 */ { UD_Ibtc, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0500 */ { UD_Ibtc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0501 */ { UD_Ibsf, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0502 */ { UD_Ibsr, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0503 */ { UD_Imovsx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0504 */ { UD_Imovsx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0505 */ { UD_Ixadd, O_Eb, O_Gb, O_NONE, P_aso|P_oso|P_rexr|P_rexx|P_rexb }, + /* 0506 */ { UD_Ixadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0507 */ { UD_Icmpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0508 */ { UD_Icmpsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0509 */ { UD_Icmpss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0510 */ { UD_Icmppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0511 */ { UD_Imovnti, O_M, O_Gy, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0512 */ { UD_Ipinsrw, O_P, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0513 */ { UD_Ipinsrw, O_V, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0514 */ { UD_Ipextrw, O_Gd, O_N, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0515 */ { UD_Ipextrw, O_Gd, O_U, O_Ib, P_aso|P_rexr|P_rexb }, + /* 0516 */ { UD_Ishufps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0517 */ { UD_Ishufpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0518 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0519 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0520 */ { UD_Icmpxchg16b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0521 */ { UD_Ivmptrld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0522 */ { UD_Ivmxon, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0523 */ { UD_Ivmclear, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0524 */ { UD_Ivmptrst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0525 */ { UD_Ibswap, O_R0y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0526 */ { UD_Ibswap, O_R1y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0527 */ { UD_Ibswap, O_R2y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0528 */ { UD_Ibswap, O_R3y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0529 */ { UD_Ibswap, O_R4y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0530 */ { UD_Ibswap, O_R5y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0531 */ { UD_Ibswap, O_R6y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0532 */ { UD_Ibswap, O_R7y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0533 */ { UD_Iaddsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0534 */ { UD_Iaddsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0535 */ { UD_Ipsrlw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0536 */ { UD_Ipsrlw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0537 */ { UD_Ipsrld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0538 */ { UD_Ipsrld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0539 */ { UD_Ipsrlq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0540 */ { UD_Ipsrlq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0541 */ { UD_Ipaddq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0542 */ { UD_Ipaddq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0543 */ { UD_Ipmullw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0544 */ { UD_Ipmullw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0545 */ { UD_Imovdq2q, O_P, O_U, O_NONE, P_aso|P_rexb }, + /* 0546 */ { UD_Imovq2dq, O_V, O_N, O_NONE, P_aso|P_rexr }, + /* 0547 */ { UD_Imovq, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0548 */ { UD_Ipmovmskb, O_Gd, O_N, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0549 */ { UD_Ipmovmskb, O_Gd, O_U, O_NONE, P_rexr|P_rexb }, + /* 0550 */ { UD_Ipsubusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0551 */ { UD_Ipsubusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0552 */ { UD_Ipsubusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0553 */ { UD_Ipsubusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0554 */ { UD_Ipminub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0555 */ { UD_Ipminub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0556 */ { UD_Ipand, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0557 */ { UD_Ipand, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0558 */ { UD_Ipaddusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0559 */ { UD_Ipaddusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0560 */ { UD_Ipaddusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0561 */ { UD_Ipaddusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0562 */ { UD_Ipmaxub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0563 */ { UD_Ipmaxub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0564 */ { UD_Ipandn, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0565 */ { UD_Ipandn, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0566 */ { UD_Ipavgb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0567 */ { UD_Ipavgb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0568 */ { UD_Ipsraw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0569 */ { UD_Ipsraw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0570 */ { UD_Ipsrad, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0571 */ { UD_Ipsrad, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0572 */ { UD_Ipavgw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0573 */ { UD_Ipavgw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0574 */ { UD_Ipmulhuw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0575 */ { UD_Ipmulhuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0576 */ { UD_Ipmulhw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0577 */ { UD_Ipmulhw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0578 */ { UD_Icvtpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0579 */ { UD_Icvtdq2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0580 */ { UD_Icvttpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0581 */ { UD_Imovntq, O_M, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0582 */ { UD_Imovntdq, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0583 */ { UD_Ipsubsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0584 */ { UD_Ipsubsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0585 */ { UD_Ipsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0586 */ { UD_Ipsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0587 */ { UD_Ipminsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0588 */ { UD_Ipminsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0589 */ { UD_Ipor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0590 */ { UD_Ipor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0591 */ { UD_Ipaddsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0592 */ { UD_Ipaddsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0593 */ { UD_Ipaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0594 */ { UD_Ipaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0595 */ { UD_Ipmaxsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0596 */ { UD_Ipmaxsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0597 */ { UD_Ipxor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0598 */ { UD_Ipxor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0599 */ { UD_Ilddqu, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0600 */ { UD_Ipsllw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0601 */ { UD_Ipsllw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0602 */ { UD_Ipslld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0603 */ { UD_Ipslld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0604 */ { UD_Ipsllq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0605 */ { UD_Ipsllq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0606 */ { UD_Ipmuludq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0607 */ { UD_Ipmuludq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0608 */ { UD_Ipmaddwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0609 */ { UD_Ipmaddwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0610 */ { UD_Ipsadbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0611 */ { UD_Ipsadbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0612 */ { UD_Imaskmovq, O_P, O_N, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0613 */ { UD_Imaskmovdqu, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0614 */ { UD_Ipsubb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0615 */ { UD_Ipsubb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0616 */ { UD_Ipsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0617 */ { UD_Ipsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0618 */ { UD_Ipsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0619 */ { UD_Ipsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0620 */ { UD_Ipsubq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0621 */ { UD_Ipsubq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0622 */ { UD_Ipaddb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0623 */ { UD_Ipaddb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0624 */ { UD_Ipaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0625 */ { UD_Ipaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0626 */ { UD_Ipaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0627 */ { UD_Ipaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0628 */ { UD_Iadc, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0629 */ { UD_Iadc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0630 */ { UD_Iadc, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0631 */ { UD_Iadc, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0632 */ { UD_Iadc, O_AL, O_Ib, O_NONE, P_none }, + /* 0633 */ { UD_Iadc, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0634 */ { UD_Ipush, O_SS, O_NONE, O_NONE, P_inv64 }, + /* 0635 */ { UD_Ipop, O_SS, O_NONE, O_NONE, P_inv64 }, + /* 0636 */ { UD_Isbb, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0637 */ { UD_Isbb, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0638 */ { UD_Isbb, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0639 */ { UD_Isbb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0640 */ { UD_Isbb, O_AL, O_Ib, O_NONE, P_none }, + /* 0641 */ { UD_Isbb, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0642 */ { UD_Ipush, O_DS, O_NONE, O_NONE, P_inv64 }, + /* 0643 */ { UD_Ipop, O_DS, O_NONE, O_NONE, P_inv64 }, + /* 0644 */ { UD_Iand, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0645 */ { UD_Iand, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0646 */ { UD_Iand, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0647 */ { UD_Iand, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0648 */ { UD_Iand, O_AL, O_Ib, O_NONE, P_none }, + /* 0649 */ { UD_Iand, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0650 */ { UD_Idaa, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0651 */ { UD_Isub, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0652 */ { UD_Isub, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0653 */ { UD_Isub, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0654 */ { UD_Isub, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0655 */ { UD_Isub, O_AL, O_Ib, O_NONE, P_none }, + /* 0656 */ { UD_Isub, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0657 */ { UD_Idas, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0658 */ { UD_Ixor, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0659 */ { UD_Ixor, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0660 */ { UD_Ixor, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0661 */ { UD_Ixor, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0662 */ { UD_Ixor, O_AL, O_Ib, O_NONE, P_none }, + /* 0663 */ { UD_Ixor, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0664 */ { UD_Iaaa, O_NONE, O_NONE, O_NONE, P_none }, + /* 0665 */ { UD_Icmp, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0666 */ { UD_Icmp, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0667 */ { UD_Icmp, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0668 */ { UD_Icmp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0669 */ { UD_Icmp, O_AL, O_Ib, O_NONE, P_none }, + /* 0670 */ { UD_Icmp, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0671 */ { UD_Iaas, O_NONE, O_NONE, O_NONE, P_none }, + /* 0672 */ { UD_Iinc, O_R0z, O_NONE, O_NONE, P_oso }, + /* 0673 */ { UD_Iinc, O_R1z, O_NONE, O_NONE, P_oso }, + /* 0674 */ { UD_Iinc, O_R2z, O_NONE, O_NONE, P_oso }, + /* 0675 */ { UD_Iinc, O_R3z, O_NONE, O_NONE, P_oso }, + /* 0676 */ { UD_Iinc, O_R4z, O_NONE, O_NONE, P_oso }, + /* 0677 */ { UD_Iinc, O_R5z, O_NONE, O_NONE, P_oso }, + /* 0678 */ { UD_Iinc, O_R6z, O_NONE, O_NONE, P_oso }, + /* 0679 */ { UD_Iinc, O_R7z, O_NONE, O_NONE, P_oso }, + /* 0680 */ { UD_Idec, O_R0z, O_NONE, O_NONE, P_oso }, + /* 0681 */ { UD_Idec, O_R1z, O_NONE, O_NONE, P_oso }, + /* 0682 */ { UD_Idec, O_R2z, O_NONE, O_NONE, P_oso }, + /* 0683 */ { UD_Idec, O_R3z, O_NONE, O_NONE, P_oso }, + /* 0684 */ { UD_Idec, O_R4z, O_NONE, O_NONE, P_oso }, + /* 0685 */ { UD_Idec, O_R5z, O_NONE, O_NONE, P_oso }, + /* 0686 */ { UD_Idec, O_R6z, O_NONE, O_NONE, P_oso }, + /* 0687 */ { UD_Idec, O_R7z, O_NONE, O_NONE, P_oso }, + /* 0688 */ { UD_Ipush, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0689 */ { UD_Ipush, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0690 */ { UD_Ipush, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0691 */ { UD_Ipush, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0692 */ { UD_Ipush, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0693 */ { UD_Ipush, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0694 */ { UD_Ipush, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0695 */ { UD_Ipush, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0696 */ { UD_Ipop, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0697 */ { UD_Ipop, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0698 */ { UD_Ipop, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0699 */ { UD_Ipop, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0700 */ { UD_Ipop, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0701 */ { UD_Ipop, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0702 */ { UD_Ipop, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0703 */ { UD_Ipop, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0704 */ { UD_Ipusha, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0705 */ { UD_Ipushad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0706 */ { UD_Ipopa, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0707 */ { UD_Ipopad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0708 */ { UD_Ibound, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0709 */ { UD_Iarpl, O_Ew, O_Gw, O_NONE, P_aso }, + /* 0710 */ { UD_Imovsxd, O_Gq, O_Ed, O_NONE, P_aso|P_oso|P_rexw|P_rexx|P_rexr|P_rexb }, + /* 0711 */ { UD_Ipush, O_sIz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0712 */ { UD_Iimul, O_Gv, O_Ev, O_Iz, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0713 */ { UD_Ipush, O_sIb, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0714 */ { UD_Iimul, O_Gv, O_Ev, O_sIb, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0715 */ { UD_Iinsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0716 */ { UD_Iinsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0717 */ { UD_Iinsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0718 */ { UD_Ioutsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0719 */ { UD_Ioutsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0720 */ { UD_Ioutsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0721 */ { UD_Ijo, O_Jb, O_NONE, O_NONE, P_none }, + /* 0722 */ { UD_Ijno, O_Jb, O_NONE, O_NONE, P_none }, + /* 0723 */ { UD_Ijb, O_Jb, O_NONE, O_NONE, P_none }, + /* 0724 */ { UD_Ijae, O_Jb, O_NONE, O_NONE, P_none }, + /* 0725 */ { UD_Ijz, O_Jb, O_NONE, O_NONE, P_none }, + /* 0726 */ { UD_Ijnz, O_Jb, O_NONE, O_NONE, P_none }, + /* 0727 */ { UD_Ijbe, O_Jb, O_NONE, O_NONE, P_none }, + /* 0728 */ { UD_Ija, O_Jb, O_NONE, O_NONE, P_none }, + /* 0729 */ { UD_Ijs, O_Jb, O_NONE, O_NONE, P_none }, + /* 0730 */ { UD_Ijns, O_Jb, O_NONE, O_NONE, P_none }, + /* 0731 */ { UD_Ijp, O_Jb, O_NONE, O_NONE, P_none }, + /* 0732 */ { UD_Ijnp, O_Jb, O_NONE, O_NONE, P_none }, + /* 0733 */ { UD_Ijl, O_Jb, O_NONE, O_NONE, P_none }, + /* 0734 */ { UD_Ijge, O_Jb, O_NONE, O_NONE, P_none }, + /* 0735 */ { UD_Ijle, O_Jb, O_NONE, O_NONE, P_none }, + /* 0736 */ { UD_Ijg, O_Jb, O_NONE, O_NONE, P_none }, + /* 0737 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0738 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0739 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0740 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0741 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0742 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0743 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0744 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0745 */ { UD_Iadd, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0746 */ { UD_Ior, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0747 */ { UD_Iadc, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0748 */ { UD_Isbb, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0749 */ { UD_Iand, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0750 */ { UD_Isub, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0751 */ { UD_Ixor, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0752 */ { UD_Icmp, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0753 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0754 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0755 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0756 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0757 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0758 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0759 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0760 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0761 */ { UD_Iadd, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0762 */ { UD_Ior, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0763 */ { UD_Iadc, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0764 */ { UD_Isbb, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0765 */ { UD_Iand, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0766 */ { UD_Isub, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0767 */ { UD_Ixor, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0768 */ { UD_Icmp, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0769 */ { UD_Itest, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0770 */ { UD_Itest, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0771 */ { UD_Ixchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0772 */ { UD_Ixchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0773 */ { UD_Imov, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0774 */ { UD_Imov, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0775 */ { UD_Imov, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0776 */ { UD_Imov, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0777 */ { UD_Imov, O_MwRv, O_S, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0778 */ { UD_Ilea, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0779 */ { UD_Imov, O_S, O_MwRv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0780 */ { UD_Ipop, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0781 */ { UD_Ixchg, O_R0v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0782 */ { UD_Ixchg, O_R1v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0783 */ { UD_Ixchg, O_R2v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0784 */ { UD_Ixchg, O_R3v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0785 */ { UD_Ixchg, O_R4v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0786 */ { UD_Ixchg, O_R5v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0787 */ { UD_Ixchg, O_R6v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0788 */ { UD_Ixchg, O_R7v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0789 */ { UD_Icbw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0790 */ { UD_Icwde, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0791 */ { UD_Icdqe, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0792 */ { UD_Icwd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0793 */ { UD_Icdq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0794 */ { UD_Icqo, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0795 */ { UD_Icall, O_Av, O_NONE, O_NONE, P_oso }, + /* 0796 */ { UD_Iwait, O_NONE, O_NONE, O_NONE, P_none }, + /* 0797 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0798 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0799 */ { UD_Ipushfd, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0800 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0801 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0802 */ { UD_Ipopfw, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0803 */ { UD_Ipopfd, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0804 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0805 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0806 */ { UD_Isahf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0807 */ { UD_Ilahf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0808 */ { UD_Imov, O_AL, O_Ob, O_NONE, P_none }, + /* 0809 */ { UD_Imov, O_rAX, O_Ov, O_NONE, P_aso|P_oso|P_rexw }, + /* 0810 */ { UD_Imov, O_Ob, O_AL, O_NONE, P_none }, + /* 0811 */ { UD_Imov, O_Ov, O_rAX, O_NONE, P_aso|P_oso|P_rexw }, + /* 0812 */ { UD_Imovsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0813 */ { UD_Imovsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0814 */ { UD_Imovsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0815 */ { UD_Imovsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0816 */ { UD_Icmpsb, O_NONE, O_NONE, O_NONE, P_strz|P_seg }, + /* 0817 */ { UD_Icmpsw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0818 */ { UD_Icmpsd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0819 */ { UD_Icmpsq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0820 */ { UD_Itest, O_AL, O_Ib, O_NONE, P_none }, + /* 0821 */ { UD_Itest, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0822 */ { UD_Istosb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0823 */ { UD_Istosw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0824 */ { UD_Istosd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0825 */ { UD_Istosq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0826 */ { UD_Ilodsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0827 */ { UD_Ilodsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0828 */ { UD_Ilodsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0829 */ { UD_Ilodsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0830 */ { UD_Iscasb, O_NONE, O_NONE, O_NONE, P_strz }, + /* 0831 */ { UD_Iscasw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0832 */ { UD_Iscasd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0833 */ { UD_Iscasq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0834 */ { UD_Imov, O_R0b, O_Ib, O_NONE, P_rexb }, + /* 0835 */ { UD_Imov, O_R1b, O_Ib, O_NONE, P_rexb }, + /* 0836 */ { UD_Imov, O_R2b, O_Ib, O_NONE, P_rexb }, + /* 0837 */ { UD_Imov, O_R3b, O_Ib, O_NONE, P_rexb }, + /* 0838 */ { UD_Imov, O_R4b, O_Ib, O_NONE, P_rexb }, + /* 0839 */ { UD_Imov, O_R5b, O_Ib, O_NONE, P_rexb }, + /* 0840 */ { UD_Imov, O_R6b, O_Ib, O_NONE, P_rexb }, + /* 0841 */ { UD_Imov, O_R7b, O_Ib, O_NONE, P_rexb }, + /* 0842 */ { UD_Imov, O_R0v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0843 */ { UD_Imov, O_R1v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0844 */ { UD_Imov, O_R2v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0845 */ { UD_Imov, O_R3v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0846 */ { UD_Imov, O_R4v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0847 */ { UD_Imov, O_R5v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0848 */ { UD_Imov, O_R6v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0849 */ { UD_Imov, O_R7v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0850 */ { UD_Irol, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0851 */ { UD_Iror, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0852 */ { UD_Ircl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0853 */ { UD_Ircr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0854 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0855 */ { UD_Ishr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0856 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0857 */ { UD_Isar, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0858 */ { UD_Irol, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0859 */ { UD_Iror, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0860 */ { UD_Ircl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0861 */ { UD_Ircr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0862 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0863 */ { UD_Ishr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0864 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0865 */ { UD_Isar, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0866 */ { UD_Iret, O_Iw, O_NONE, O_NONE, P_none }, + /* 0867 */ { UD_Iret, O_NONE, O_NONE, O_NONE, P_none }, + /* 0868 */ { UD_Iles, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0869 */ { UD_Ilds, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0870 */ { UD_Imov, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0871 */ { UD_Imov, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0872 */ { UD_Ienter, O_Iw, O_Ib, O_NONE, P_def64 }, + /* 0873 */ { UD_Ileave, O_NONE, O_NONE, O_NONE, P_none }, + /* 0874 */ { UD_Iretf, O_Iw, O_NONE, O_NONE, P_none }, + /* 0875 */ { UD_Iretf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0876 */ { UD_Iint3, O_NONE, O_NONE, O_NONE, P_none }, + /* 0877 */ { UD_Iint, O_Ib, O_NONE, O_NONE, P_none }, + /* 0878 */ { UD_Iinto, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0879 */ { UD_Iiretw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0880 */ { UD_Iiretd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0881 */ { UD_Iiretq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0882 */ { UD_Irol, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0883 */ { UD_Iror, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0884 */ { UD_Ircl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0885 */ { UD_Ircr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0886 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0887 */ { UD_Ishr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0888 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0889 */ { UD_Isar, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0890 */ { UD_Irol, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0891 */ { UD_Iror, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0892 */ { UD_Ircl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0893 */ { UD_Ircr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0894 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0895 */ { UD_Ishr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0896 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0897 */ { UD_Isar, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0898 */ { UD_Irol, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0899 */ { UD_Iror, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0900 */ { UD_Ircl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0901 */ { UD_Ircr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0902 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0903 */ { UD_Ishr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0904 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0905 */ { UD_Isar, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0906 */ { UD_Irol, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0907 */ { UD_Iror, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0908 */ { UD_Ircl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0909 */ { UD_Ircr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0910 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0911 */ { UD_Ishr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0912 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0913 */ { UD_Isar, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0914 */ { UD_Iaam, O_Ib, O_NONE, O_NONE, P_none }, + /* 0915 */ { UD_Iaad, O_Ib, O_NONE, O_NONE, P_none }, + /* 0916 */ { UD_Isalc, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0917 */ { UD_Ixlatb, O_NONE, O_NONE, O_NONE, P_rexw|P_seg }, + /* 0918 */ { UD_Ifadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0919 */ { UD_Ifmul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0920 */ { UD_Ifcom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0921 */ { UD_Ifcomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0922 */ { UD_Ifsub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0923 */ { UD_Ifsubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0924 */ { UD_Ifdiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0925 */ { UD_Ifdivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0926 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, + /* 0927 */ { UD_Ifadd, O_ST0, O_ST1, O_NONE, P_none }, + /* 0928 */ { UD_Ifadd, O_ST0, O_ST2, O_NONE, P_none }, + /* 0929 */ { UD_Ifadd, O_ST0, O_ST3, O_NONE, P_none }, + /* 0930 */ { UD_Ifadd, O_ST0, O_ST4, O_NONE, P_none }, + /* 0931 */ { UD_Ifadd, O_ST0, O_ST5, O_NONE, P_none }, + /* 0932 */ { UD_Ifadd, O_ST0, O_ST6, O_NONE, P_none }, + /* 0933 */ { UD_Ifadd, O_ST0, O_ST7, O_NONE, P_none }, + /* 0934 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, + /* 0935 */ { UD_Ifmul, O_ST0, O_ST1, O_NONE, P_none }, + /* 0936 */ { UD_Ifmul, O_ST0, O_ST2, O_NONE, P_none }, + /* 0937 */ { UD_Ifmul, O_ST0, O_ST3, O_NONE, P_none }, + /* 0938 */ { UD_Ifmul, O_ST0, O_ST4, O_NONE, P_none }, + /* 0939 */ { UD_Ifmul, O_ST0, O_ST5, O_NONE, P_none }, + /* 0940 */ { UD_Ifmul, O_ST0, O_ST6, O_NONE, P_none }, + /* 0941 */ { UD_Ifmul, O_ST0, O_ST7, O_NONE, P_none }, + /* 0942 */ { UD_Ifcom, O_ST0, O_ST0, O_NONE, P_none }, + /* 0943 */ { UD_Ifcom, O_ST0, O_ST1, O_NONE, P_none }, + /* 0944 */ { UD_Ifcom, O_ST0, O_ST2, O_NONE, P_none }, + /* 0945 */ { UD_Ifcom, O_ST0, O_ST3, O_NONE, P_none }, + /* 0946 */ { UD_Ifcom, O_ST0, O_ST4, O_NONE, P_none }, + /* 0947 */ { UD_Ifcom, O_ST0, O_ST5, O_NONE, P_none }, + /* 0948 */ { UD_Ifcom, O_ST0, O_ST6, O_NONE, P_none }, + /* 0949 */ { UD_Ifcom, O_ST0, O_ST7, O_NONE, P_none }, + /* 0950 */ { UD_Ifcomp, O_ST0, O_ST0, O_NONE, P_none }, + /* 0951 */ { UD_Ifcomp, O_ST0, O_ST1, O_NONE, P_none }, + /* 0952 */ { UD_Ifcomp, O_ST0, O_ST2, O_NONE, P_none }, + /* 0953 */ { UD_Ifcomp, O_ST0, O_ST3, O_NONE, P_none }, + /* 0954 */ { UD_Ifcomp, O_ST0, O_ST4, O_NONE, P_none }, + /* 0955 */ { UD_Ifcomp, O_ST0, O_ST5, O_NONE, P_none }, + /* 0956 */ { UD_Ifcomp, O_ST0, O_ST6, O_NONE, P_none }, + /* 0957 */ { UD_Ifcomp, O_ST0, O_ST7, O_NONE, P_none }, + /* 0958 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, + /* 0959 */ { UD_Ifsub, O_ST0, O_ST1, O_NONE, P_none }, + /* 0960 */ { UD_Ifsub, O_ST0, O_ST2, O_NONE, P_none }, + /* 0961 */ { UD_Ifsub, O_ST0, O_ST3, O_NONE, P_none }, + /* 0962 */ { UD_Ifsub, O_ST0, O_ST4, O_NONE, P_none }, + /* 0963 */ { UD_Ifsub, O_ST0, O_ST5, O_NONE, P_none }, + /* 0964 */ { UD_Ifsub, O_ST0, O_ST6, O_NONE, P_none }, + /* 0965 */ { UD_Ifsub, O_ST0, O_ST7, O_NONE, P_none }, + /* 0966 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, + /* 0967 */ { UD_Ifsubr, O_ST0, O_ST1, O_NONE, P_none }, + /* 0968 */ { UD_Ifsubr, O_ST0, O_ST2, O_NONE, P_none }, + /* 0969 */ { UD_Ifsubr, O_ST0, O_ST3, O_NONE, P_none }, + /* 0970 */ { UD_Ifsubr, O_ST0, O_ST4, O_NONE, P_none }, + /* 0971 */ { UD_Ifsubr, O_ST0, O_ST5, O_NONE, P_none }, + /* 0972 */ { UD_Ifsubr, O_ST0, O_ST6, O_NONE, P_none }, + /* 0973 */ { UD_Ifsubr, O_ST0, O_ST7, O_NONE, P_none }, + /* 0974 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, + /* 0975 */ { UD_Ifdiv, O_ST0, O_ST1, O_NONE, P_none }, + /* 0976 */ { UD_Ifdiv, O_ST0, O_ST2, O_NONE, P_none }, + /* 0977 */ { UD_Ifdiv, O_ST0, O_ST3, O_NONE, P_none }, + /* 0978 */ { UD_Ifdiv, O_ST0, O_ST4, O_NONE, P_none }, + /* 0979 */ { UD_Ifdiv, O_ST0, O_ST5, O_NONE, P_none }, + /* 0980 */ { UD_Ifdiv, O_ST0, O_ST6, O_NONE, P_none }, + /* 0981 */ { UD_Ifdiv, O_ST0, O_ST7, O_NONE, P_none }, + /* 0982 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, + /* 0983 */ { UD_Ifdivr, O_ST0, O_ST1, O_NONE, P_none }, + /* 0984 */ { UD_Ifdivr, O_ST0, O_ST2, O_NONE, P_none }, + /* 0985 */ { UD_Ifdivr, O_ST0, O_ST3, O_NONE, P_none }, + /* 0986 */ { UD_Ifdivr, O_ST0, O_ST4, O_NONE, P_none }, + /* 0987 */ { UD_Ifdivr, O_ST0, O_ST5, O_NONE, P_none }, + /* 0988 */ { UD_Ifdivr, O_ST0, O_ST6, O_NONE, P_none }, + /* 0989 */ { UD_Ifdivr, O_ST0, O_ST7, O_NONE, P_none }, + /* 0990 */ { UD_Ifld, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0991 */ { UD_Ifst, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0992 */ { UD_Ifstp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0993 */ { UD_Ifldenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0994 */ { UD_Ifldcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0995 */ { UD_Ifnstenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0996 */ { UD_Ifnstcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0997 */ { UD_Ifld, O_ST0, O_NONE, O_NONE, P_none }, + /* 0998 */ { UD_Ifld, O_ST1, O_NONE, O_NONE, P_none }, + /* 0999 */ { UD_Ifld, O_ST2, O_NONE, O_NONE, P_none }, + /* 1000 */ { UD_Ifld, O_ST3, O_NONE, O_NONE, P_none }, + /* 1001 */ { UD_Ifld, O_ST4, O_NONE, O_NONE, P_none }, + /* 1002 */ { UD_Ifld, O_ST5, O_NONE, O_NONE, P_none }, + /* 1003 */ { UD_Ifld, O_ST6, O_NONE, O_NONE, P_none }, + /* 1004 */ { UD_Ifld, O_ST7, O_NONE, O_NONE, P_none }, + /* 1005 */ { UD_Ifxch, O_ST0, O_ST0, O_NONE, P_none }, + /* 1006 */ { UD_Ifxch, O_ST0, O_ST1, O_NONE, P_none }, + /* 1007 */ { UD_Ifxch, O_ST0, O_ST2, O_NONE, P_none }, + /* 1008 */ { UD_Ifxch, O_ST0, O_ST3, O_NONE, P_none }, + /* 1009 */ { UD_Ifxch, O_ST0, O_ST4, O_NONE, P_none }, + /* 1010 */ { UD_Ifxch, O_ST0, O_ST5, O_NONE, P_none }, + /* 1011 */ { UD_Ifxch, O_ST0, O_ST6, O_NONE, P_none }, + /* 1012 */ { UD_Ifxch, O_ST0, O_ST7, O_NONE, P_none }, + /* 1013 */ { UD_Ifnop, O_NONE, O_NONE, O_NONE, P_none }, + /* 1014 */ { UD_Ifstp1, O_ST0, O_NONE, O_NONE, P_none }, + /* 1015 */ { UD_Ifstp1, O_ST1, O_NONE, O_NONE, P_none }, + /* 1016 */ { UD_Ifstp1, O_ST2, O_NONE, O_NONE, P_none }, + /* 1017 */ { UD_Ifstp1, O_ST3, O_NONE, O_NONE, P_none }, + /* 1018 */ { UD_Ifstp1, O_ST4, O_NONE, O_NONE, P_none }, + /* 1019 */ { UD_Ifstp1, O_ST5, O_NONE, O_NONE, P_none }, + /* 1020 */ { UD_Ifstp1, O_ST6, O_NONE, O_NONE, P_none }, + /* 1021 */ { UD_Ifstp1, O_ST7, O_NONE, O_NONE, P_none }, + /* 1022 */ { UD_Ifchs, O_NONE, O_NONE, O_NONE, P_none }, + /* 1023 */ { UD_Ifabs, O_NONE, O_NONE, O_NONE, P_none }, + /* 1024 */ { UD_Iftst, O_NONE, O_NONE, O_NONE, P_none }, + /* 1025 */ { UD_Ifxam, O_NONE, O_NONE, O_NONE, P_none }, + /* 1026 */ { UD_Ifld1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1027 */ { UD_Ifldl2t, O_NONE, O_NONE, O_NONE, P_none }, + /* 1028 */ { UD_Ifldl2e, O_NONE, O_NONE, O_NONE, P_none }, + /* 1029 */ { UD_Ifldpi, O_NONE, O_NONE, O_NONE, P_none }, + /* 1030 */ { UD_Ifldlg2, O_NONE, O_NONE, O_NONE, P_none }, + /* 1031 */ { UD_Ifldln2, O_NONE, O_NONE, O_NONE, P_none }, + /* 1032 */ { UD_Ifldz, O_NONE, O_NONE, O_NONE, P_none }, + /* 1033 */ { UD_If2xm1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1034 */ { UD_Ifyl2x, O_NONE, O_NONE, O_NONE, P_none }, + /* 1035 */ { UD_Ifptan, O_NONE, O_NONE, O_NONE, P_none }, + /* 1036 */ { UD_Ifpatan, O_NONE, O_NONE, O_NONE, P_none }, + /* 1037 */ { UD_Ifxtract, O_NONE, O_NONE, O_NONE, P_none }, + /* 1038 */ { UD_Ifprem1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1039 */ { UD_Ifdecstp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1040 */ { UD_Ifincstp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1041 */ { UD_Ifprem, O_NONE, O_NONE, O_NONE, P_none }, + /* 1042 */ { UD_Ifyl2xp1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1043 */ { UD_Ifsqrt, O_NONE, O_NONE, O_NONE, P_none }, + /* 1044 */ { UD_Ifsincos, O_NONE, O_NONE, O_NONE, P_none }, + /* 1045 */ { UD_Ifrndint, O_NONE, O_NONE, O_NONE, P_none }, + /* 1046 */ { UD_Ifscale, O_NONE, O_NONE, O_NONE, P_none }, + /* 1047 */ { UD_Ifsin, O_NONE, O_NONE, O_NONE, P_none }, + /* 1048 */ { UD_Ifcos, O_NONE, O_NONE, O_NONE, P_none }, + /* 1049 */ { UD_Ifiadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1050 */ { UD_Ifimul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1051 */ { UD_Ificom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1052 */ { UD_Ificomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1053 */ { UD_Ifisub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1054 */ { UD_Ifisubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1055 */ { UD_Ifidiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1056 */ { UD_Ifidivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1057 */ { UD_Ifcmovb, O_ST0, O_ST0, O_NONE, P_none }, + /* 1058 */ { UD_Ifcmovb, O_ST0, O_ST1, O_NONE, P_none }, + /* 1059 */ { UD_Ifcmovb, O_ST0, O_ST2, O_NONE, P_none }, + /* 1060 */ { UD_Ifcmovb, O_ST0, O_ST3, O_NONE, P_none }, + /* 1061 */ { UD_Ifcmovb, O_ST0, O_ST4, O_NONE, P_none }, + /* 1062 */ { UD_Ifcmovb, O_ST0, O_ST5, O_NONE, P_none }, + /* 1063 */ { UD_Ifcmovb, O_ST0, O_ST6, O_NONE, P_none }, + /* 1064 */ { UD_Ifcmovb, O_ST0, O_ST7, O_NONE, P_none }, + /* 1065 */ { UD_Ifcmove, O_ST0, O_ST0, O_NONE, P_none }, + /* 1066 */ { UD_Ifcmove, O_ST0, O_ST1, O_NONE, P_none }, + /* 1067 */ { UD_Ifcmove, O_ST0, O_ST2, O_NONE, P_none }, + /* 1068 */ { UD_Ifcmove, O_ST0, O_ST3, O_NONE, P_none }, + /* 1069 */ { UD_Ifcmove, O_ST0, O_ST4, O_NONE, P_none }, + /* 1070 */ { UD_Ifcmove, O_ST0, O_ST5, O_NONE, P_none }, + /* 1071 */ { UD_Ifcmove, O_ST0, O_ST6, O_NONE, P_none }, + /* 1072 */ { UD_Ifcmove, O_ST0, O_ST7, O_NONE, P_none }, + /* 1073 */ { UD_Ifcmovbe, O_ST0, O_ST0, O_NONE, P_none }, + /* 1074 */ { UD_Ifcmovbe, O_ST0, O_ST1, O_NONE, P_none }, + /* 1075 */ { UD_Ifcmovbe, O_ST0, O_ST2, O_NONE, P_none }, + /* 1076 */ { UD_Ifcmovbe, O_ST0, O_ST3, O_NONE, P_none }, + /* 1077 */ { UD_Ifcmovbe, O_ST0, O_ST4, O_NONE, P_none }, + /* 1078 */ { UD_Ifcmovbe, O_ST0, O_ST5, O_NONE, P_none }, + /* 1079 */ { UD_Ifcmovbe, O_ST0, O_ST6, O_NONE, P_none }, + /* 1080 */ { UD_Ifcmovbe, O_ST0, O_ST7, O_NONE, P_none }, + /* 1081 */ { UD_Ifcmovu, O_ST0, O_ST0, O_NONE, P_none }, + /* 1082 */ { UD_Ifcmovu, O_ST0, O_ST1, O_NONE, P_none }, + /* 1083 */ { UD_Ifcmovu, O_ST0, O_ST2, O_NONE, P_none }, + /* 1084 */ { UD_Ifcmovu, O_ST0, O_ST3, O_NONE, P_none }, + /* 1085 */ { UD_Ifcmovu, O_ST0, O_ST4, O_NONE, P_none }, + /* 1086 */ { UD_Ifcmovu, O_ST0, O_ST5, O_NONE, P_none }, + /* 1087 */ { UD_Ifcmovu, O_ST0, O_ST6, O_NONE, P_none }, + /* 1088 */ { UD_Ifcmovu, O_ST0, O_ST7, O_NONE, P_none }, + /* 1089 */ { UD_Ifucompp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1090 */ { UD_Ifild, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1091 */ { UD_Ifisttp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1092 */ { UD_Ifist, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1093 */ { UD_Ifistp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1094 */ { UD_Ifld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1095 */ { UD_Ifstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1096 */ { UD_Ifcmovnb, O_ST0, O_ST0, O_NONE, P_none }, + /* 1097 */ { UD_Ifcmovnb, O_ST0, O_ST1, O_NONE, P_none }, + /* 1098 */ { UD_Ifcmovnb, O_ST0, O_ST2, O_NONE, P_none }, + /* 1099 */ { UD_Ifcmovnb, O_ST0, O_ST3, O_NONE, P_none }, + /* 1100 */ { UD_Ifcmovnb, O_ST0, O_ST4, O_NONE, P_none }, + /* 1101 */ { UD_Ifcmovnb, O_ST0, O_ST5, O_NONE, P_none }, + /* 1102 */ { UD_Ifcmovnb, O_ST0, O_ST6, O_NONE, P_none }, + /* 1103 */ { UD_Ifcmovnb, O_ST0, O_ST7, O_NONE, P_none }, + /* 1104 */ { UD_Ifcmovne, O_ST0, O_ST0, O_NONE, P_none }, + /* 1105 */ { UD_Ifcmovne, O_ST0, O_ST1, O_NONE, P_none }, + /* 1106 */ { UD_Ifcmovne, O_ST0, O_ST2, O_NONE, P_none }, + /* 1107 */ { UD_Ifcmovne, O_ST0, O_ST3, O_NONE, P_none }, + /* 1108 */ { UD_Ifcmovne, O_ST0, O_ST4, O_NONE, P_none }, + /* 1109 */ { UD_Ifcmovne, O_ST0, O_ST5, O_NONE, P_none }, + /* 1110 */ { UD_Ifcmovne, O_ST0, O_ST6, O_NONE, P_none }, + /* 1111 */ { UD_Ifcmovne, O_ST0, O_ST7, O_NONE, P_none }, + /* 1112 */ { UD_Ifcmovnbe, O_ST0, O_ST0, O_NONE, P_none }, + /* 1113 */ { UD_Ifcmovnbe, O_ST0, O_ST1, O_NONE, P_none }, + /* 1114 */ { UD_Ifcmovnbe, O_ST0, O_ST2, O_NONE, P_none }, + /* 1115 */ { UD_Ifcmovnbe, O_ST0, O_ST3, O_NONE, P_none }, + /* 1116 */ { UD_Ifcmovnbe, O_ST0, O_ST4, O_NONE, P_none }, + /* 1117 */ { UD_Ifcmovnbe, O_ST0, O_ST5, O_NONE, P_none }, + /* 1118 */ { UD_Ifcmovnbe, O_ST0, O_ST6, O_NONE, P_none }, + /* 1119 */ { UD_Ifcmovnbe, O_ST0, O_ST7, O_NONE, P_none }, + /* 1120 */ { UD_Ifcmovnu, O_ST0, O_ST0, O_NONE, P_none }, + /* 1121 */ { UD_Ifcmovnu, O_ST0, O_ST1, O_NONE, P_none }, + /* 1122 */ { UD_Ifcmovnu, O_ST0, O_ST2, O_NONE, P_none }, + /* 1123 */ { UD_Ifcmovnu, O_ST0, O_ST3, O_NONE, P_none }, + /* 1124 */ { UD_Ifcmovnu, O_ST0, O_ST4, O_NONE, P_none }, + /* 1125 */ { UD_Ifcmovnu, O_ST0, O_ST5, O_NONE, P_none }, + /* 1126 */ { UD_Ifcmovnu, O_ST0, O_ST6, O_NONE, P_none }, + /* 1127 */ { UD_Ifcmovnu, O_ST0, O_ST7, O_NONE, P_none }, + /* 1128 */ { UD_Ifclex, O_NONE, O_NONE, O_NONE, P_none }, + /* 1129 */ { UD_Ifninit, O_NONE, O_NONE, O_NONE, P_none }, + /* 1130 */ { UD_Ifucomi, O_ST0, O_ST0, O_NONE, P_none }, + /* 1131 */ { UD_Ifucomi, O_ST0, O_ST1, O_NONE, P_none }, + /* 1132 */ { UD_Ifucomi, O_ST0, O_ST2, O_NONE, P_none }, + /* 1133 */ { UD_Ifucomi, O_ST0, O_ST3, O_NONE, P_none }, + /* 1134 */ { UD_Ifucomi, O_ST0, O_ST4, O_NONE, P_none }, + /* 1135 */ { UD_Ifucomi, O_ST0, O_ST5, O_NONE, P_none }, + /* 1136 */ { UD_Ifucomi, O_ST0, O_ST6, O_NONE, P_none }, + /* 1137 */ { UD_Ifucomi, O_ST0, O_ST7, O_NONE, P_none }, + /* 1138 */ { UD_Ifcomi, O_ST0, O_ST0, O_NONE, P_none }, + /* 1139 */ { UD_Ifcomi, O_ST0, O_ST1, O_NONE, P_none }, + /* 1140 */ { UD_Ifcomi, O_ST0, O_ST2, O_NONE, P_none }, + /* 1141 */ { UD_Ifcomi, O_ST0, O_ST3, O_NONE, P_none }, + /* 1142 */ { UD_Ifcomi, O_ST0, O_ST4, O_NONE, P_none }, + /* 1143 */ { UD_Ifcomi, O_ST0, O_ST5, O_NONE, P_none }, + /* 1144 */ { UD_Ifcomi, O_ST0, O_ST6, O_NONE, P_none }, + /* 1145 */ { UD_Ifcomi, O_ST0, O_ST7, O_NONE, P_none }, + /* 1146 */ { UD_Ifadd, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1147 */ { UD_Ifmul, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1148 */ { UD_Ifcom, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1149 */ { UD_Ifcomp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1150 */ { UD_Ifsub, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1151 */ { UD_Ifsubr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1152 */ { UD_Ifdiv, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1153 */ { UD_Ifdivr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1154 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, + /* 1155 */ { UD_Ifadd, O_ST1, O_ST0, O_NONE, P_none }, + /* 1156 */ { UD_Ifadd, O_ST2, O_ST0, O_NONE, P_none }, + /* 1157 */ { UD_Ifadd, O_ST3, O_ST0, O_NONE, P_none }, + /* 1158 */ { UD_Ifadd, O_ST4, O_ST0, O_NONE, P_none }, + /* 1159 */ { UD_Ifadd, O_ST5, O_ST0, O_NONE, P_none }, + /* 1160 */ { UD_Ifadd, O_ST6, O_ST0, O_NONE, P_none }, + /* 1161 */ { UD_Ifadd, O_ST7, O_ST0, O_NONE, P_none }, + /* 1162 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, + /* 1163 */ { UD_Ifmul, O_ST1, O_ST0, O_NONE, P_none }, + /* 1164 */ { UD_Ifmul, O_ST2, O_ST0, O_NONE, P_none }, + /* 1165 */ { UD_Ifmul, O_ST3, O_ST0, O_NONE, P_none }, + /* 1166 */ { UD_Ifmul, O_ST4, O_ST0, O_NONE, P_none }, + /* 1167 */ { UD_Ifmul, O_ST5, O_ST0, O_NONE, P_none }, + /* 1168 */ { UD_Ifmul, O_ST6, O_ST0, O_NONE, P_none }, + /* 1169 */ { UD_Ifmul, O_ST7, O_ST0, O_NONE, P_none }, + /* 1170 */ { UD_Ifcom2, O_ST0, O_NONE, O_NONE, P_none }, + /* 1171 */ { UD_Ifcom2, O_ST1, O_NONE, O_NONE, P_none }, + /* 1172 */ { UD_Ifcom2, O_ST2, O_NONE, O_NONE, P_none }, + /* 1173 */ { UD_Ifcom2, O_ST3, O_NONE, O_NONE, P_none }, + /* 1174 */ { UD_Ifcom2, O_ST4, O_NONE, O_NONE, P_none }, + /* 1175 */ { UD_Ifcom2, O_ST5, O_NONE, O_NONE, P_none }, + /* 1176 */ { UD_Ifcom2, O_ST6, O_NONE, O_NONE, P_none }, + /* 1177 */ { UD_Ifcom2, O_ST7, O_NONE, O_NONE, P_none }, + /* 1178 */ { UD_Ifcomp3, O_ST0, O_NONE, O_NONE, P_none }, + /* 1179 */ { UD_Ifcomp3, O_ST1, O_NONE, O_NONE, P_none }, + /* 1180 */ { UD_Ifcomp3, O_ST2, O_NONE, O_NONE, P_none }, + /* 1181 */ { UD_Ifcomp3, O_ST3, O_NONE, O_NONE, P_none }, + /* 1182 */ { UD_Ifcomp3, O_ST4, O_NONE, O_NONE, P_none }, + /* 1183 */ { UD_Ifcomp3, O_ST5, O_NONE, O_NONE, P_none }, + /* 1184 */ { UD_Ifcomp3, O_ST6, O_NONE, O_NONE, P_none }, + /* 1185 */ { UD_Ifcomp3, O_ST7, O_NONE, O_NONE, P_none }, + /* 1186 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, + /* 1187 */ { UD_Ifsubr, O_ST1, O_ST0, O_NONE, P_none }, + /* 1188 */ { UD_Ifsubr, O_ST2, O_ST0, O_NONE, P_none }, + /* 1189 */ { UD_Ifsubr, O_ST3, O_ST0, O_NONE, P_none }, + /* 1190 */ { UD_Ifsubr, O_ST4, O_ST0, O_NONE, P_none }, + /* 1191 */ { UD_Ifsubr, O_ST5, O_ST0, O_NONE, P_none }, + /* 1192 */ { UD_Ifsubr, O_ST6, O_ST0, O_NONE, P_none }, + /* 1193 */ { UD_Ifsubr, O_ST7, O_ST0, O_NONE, P_none }, + /* 1194 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, + /* 1195 */ { UD_Ifsub, O_ST1, O_ST0, O_NONE, P_none }, + /* 1196 */ { UD_Ifsub, O_ST2, O_ST0, O_NONE, P_none }, + /* 1197 */ { UD_Ifsub, O_ST3, O_ST0, O_NONE, P_none }, + /* 1198 */ { UD_Ifsub, O_ST4, O_ST0, O_NONE, P_none }, + /* 1199 */ { UD_Ifsub, O_ST5, O_ST0, O_NONE, P_none }, + /* 1200 */ { UD_Ifsub, O_ST6, O_ST0, O_NONE, P_none }, + /* 1201 */ { UD_Ifsub, O_ST7, O_ST0, O_NONE, P_none }, + /* 1202 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, + /* 1203 */ { UD_Ifdivr, O_ST1, O_ST0, O_NONE, P_none }, + /* 1204 */ { UD_Ifdivr, O_ST2, O_ST0, O_NONE, P_none }, + /* 1205 */ { UD_Ifdivr, O_ST3, O_ST0, O_NONE, P_none }, + /* 1206 */ { UD_Ifdivr, O_ST4, O_ST0, O_NONE, P_none }, + /* 1207 */ { UD_Ifdivr, O_ST5, O_ST0, O_NONE, P_none }, + /* 1208 */ { UD_Ifdivr, O_ST6, O_ST0, O_NONE, P_none }, + /* 1209 */ { UD_Ifdivr, O_ST7, O_ST0, O_NONE, P_none }, + /* 1210 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, + /* 1211 */ { UD_Ifdiv, O_ST1, O_ST0, O_NONE, P_none }, + /* 1212 */ { UD_Ifdiv, O_ST2, O_ST0, O_NONE, P_none }, + /* 1213 */ { UD_Ifdiv, O_ST3, O_ST0, O_NONE, P_none }, + /* 1214 */ { UD_Ifdiv, O_ST4, O_ST0, O_NONE, P_none }, + /* 1215 */ { UD_Ifdiv, O_ST5, O_ST0, O_NONE, P_none }, + /* 1216 */ { UD_Ifdiv, O_ST6, O_ST0, O_NONE, P_none }, + /* 1217 */ { UD_Ifdiv, O_ST7, O_ST0, O_NONE, P_none }, + /* 1218 */ { UD_Ifld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1219 */ { UD_Ifisttp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1220 */ { UD_Ifst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1221 */ { UD_Ifstp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1222 */ { UD_Ifrstor, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1223 */ { UD_Ifnsave, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1224 */ { UD_Ifnstsw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1225 */ { UD_Iffree, O_ST0, O_NONE, O_NONE, P_none }, + /* 1226 */ { UD_Iffree, O_ST1, O_NONE, O_NONE, P_none }, + /* 1227 */ { UD_Iffree, O_ST2, O_NONE, O_NONE, P_none }, + /* 1228 */ { UD_Iffree, O_ST3, O_NONE, O_NONE, P_none }, + /* 1229 */ { UD_Iffree, O_ST4, O_NONE, O_NONE, P_none }, + /* 1230 */ { UD_Iffree, O_ST5, O_NONE, O_NONE, P_none }, + /* 1231 */ { UD_Iffree, O_ST6, O_NONE, O_NONE, P_none }, + /* 1232 */ { UD_Iffree, O_ST7, O_NONE, O_NONE, P_none }, + /* 1233 */ { UD_Ifxch4, O_ST0, O_NONE, O_NONE, P_none }, + /* 1234 */ { UD_Ifxch4, O_ST1, O_NONE, O_NONE, P_none }, + /* 1235 */ { UD_Ifxch4, O_ST2, O_NONE, O_NONE, P_none }, + /* 1236 */ { UD_Ifxch4, O_ST3, O_NONE, O_NONE, P_none }, + /* 1237 */ { UD_Ifxch4, O_ST4, O_NONE, O_NONE, P_none }, + /* 1238 */ { UD_Ifxch4, O_ST5, O_NONE, O_NONE, P_none }, + /* 1239 */ { UD_Ifxch4, O_ST6, O_NONE, O_NONE, P_none }, + /* 1240 */ { UD_Ifxch4, O_ST7, O_NONE, O_NONE, P_none }, + /* 1241 */ { UD_Ifst, O_ST0, O_NONE, O_NONE, P_none }, + /* 1242 */ { UD_Ifst, O_ST1, O_NONE, O_NONE, P_none }, + /* 1243 */ { UD_Ifst, O_ST2, O_NONE, O_NONE, P_none }, + /* 1244 */ { UD_Ifst, O_ST3, O_NONE, O_NONE, P_none }, + /* 1245 */ { UD_Ifst, O_ST4, O_NONE, O_NONE, P_none }, + /* 1246 */ { UD_Ifst, O_ST5, O_NONE, O_NONE, P_none }, + /* 1247 */ { UD_Ifst, O_ST6, O_NONE, O_NONE, P_none }, + /* 1248 */ { UD_Ifst, O_ST7, O_NONE, O_NONE, P_none }, + /* 1249 */ { UD_Ifstp, O_ST0, O_NONE, O_NONE, P_none }, + /* 1250 */ { UD_Ifstp, O_ST1, O_NONE, O_NONE, P_none }, + /* 1251 */ { UD_Ifstp, O_ST2, O_NONE, O_NONE, P_none }, + /* 1252 */ { UD_Ifstp, O_ST3, O_NONE, O_NONE, P_none }, + /* 1253 */ { UD_Ifstp, O_ST4, O_NONE, O_NONE, P_none }, + /* 1254 */ { UD_Ifstp, O_ST5, O_NONE, O_NONE, P_none }, + /* 1255 */ { UD_Ifstp, O_ST6, O_NONE, O_NONE, P_none }, + /* 1256 */ { UD_Ifstp, O_ST7, O_NONE, O_NONE, P_none }, + /* 1257 */ { UD_Ifucom, O_ST0, O_NONE, O_NONE, P_none }, + /* 1258 */ { UD_Ifucom, O_ST1, O_NONE, O_NONE, P_none }, + /* 1259 */ { UD_Ifucom, O_ST2, O_NONE, O_NONE, P_none }, + /* 1260 */ { UD_Ifucom, O_ST3, O_NONE, O_NONE, P_none }, + /* 1261 */ { UD_Ifucom, O_ST4, O_NONE, O_NONE, P_none }, + /* 1262 */ { UD_Ifucom, O_ST5, O_NONE, O_NONE, P_none }, + /* 1263 */ { UD_Ifucom, O_ST6, O_NONE, O_NONE, P_none }, + /* 1264 */ { UD_Ifucom, O_ST7, O_NONE, O_NONE, P_none }, + /* 1265 */ { UD_Ifucomp, O_ST0, O_NONE, O_NONE, P_none }, + /* 1266 */ { UD_Ifucomp, O_ST1, O_NONE, O_NONE, P_none }, + /* 1267 */ { UD_Ifucomp, O_ST2, O_NONE, O_NONE, P_none }, + /* 1268 */ { UD_Ifucomp, O_ST3, O_NONE, O_NONE, P_none }, + /* 1269 */ { UD_Ifucomp, O_ST4, O_NONE, O_NONE, P_none }, + /* 1270 */ { UD_Ifucomp, O_ST5, O_NONE, O_NONE, P_none }, + /* 1271 */ { UD_Ifucomp, O_ST6, O_NONE, O_NONE, P_none }, + /* 1272 */ { UD_Ifucomp, O_ST7, O_NONE, O_NONE, P_none }, + /* 1273 */ { UD_Ifiadd, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1274 */ { UD_Ifimul, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1275 */ { UD_Ificom, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1276 */ { UD_Ificomp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1277 */ { UD_Ifisub, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1278 */ { UD_Ifisubr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1279 */ { UD_Ifidiv, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1280 */ { UD_Ifidivr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1281 */ { UD_Ifaddp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1282 */ { UD_Ifaddp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1283 */ { UD_Ifaddp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1284 */ { UD_Ifaddp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1285 */ { UD_Ifaddp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1286 */ { UD_Ifaddp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1287 */ { UD_Ifaddp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1288 */ { UD_Ifaddp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1289 */ { UD_Ifmulp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1290 */ { UD_Ifmulp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1291 */ { UD_Ifmulp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1292 */ { UD_Ifmulp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1293 */ { UD_Ifmulp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1294 */ { UD_Ifmulp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1295 */ { UD_Ifmulp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1296 */ { UD_Ifmulp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1297 */ { UD_Ifcomp5, O_ST0, O_NONE, O_NONE, P_none }, + /* 1298 */ { UD_Ifcomp5, O_ST1, O_NONE, O_NONE, P_none }, + /* 1299 */ { UD_Ifcomp5, O_ST2, O_NONE, O_NONE, P_none }, + /* 1300 */ { UD_Ifcomp5, O_ST3, O_NONE, O_NONE, P_none }, + /* 1301 */ { UD_Ifcomp5, O_ST4, O_NONE, O_NONE, P_none }, + /* 1302 */ { UD_Ifcomp5, O_ST5, O_NONE, O_NONE, P_none }, + /* 1303 */ { UD_Ifcomp5, O_ST6, O_NONE, O_NONE, P_none }, + /* 1304 */ { UD_Ifcomp5, O_ST7, O_NONE, O_NONE, P_none }, + /* 1305 */ { UD_Ifcompp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1306 */ { UD_Ifsubrp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1307 */ { UD_Ifsubrp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1308 */ { UD_Ifsubrp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1309 */ { UD_Ifsubrp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1310 */ { UD_Ifsubrp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1311 */ { UD_Ifsubrp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1312 */ { UD_Ifsubrp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1313 */ { UD_Ifsubrp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1314 */ { UD_Ifsubp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1315 */ { UD_Ifsubp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1316 */ { UD_Ifsubp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1317 */ { UD_Ifsubp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1318 */ { UD_Ifsubp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1319 */ { UD_Ifsubp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1320 */ { UD_Ifsubp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1321 */ { UD_Ifsubp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1322 */ { UD_Ifdivrp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1323 */ { UD_Ifdivrp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1324 */ { UD_Ifdivrp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1325 */ { UD_Ifdivrp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1326 */ { UD_Ifdivrp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1327 */ { UD_Ifdivrp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1328 */ { UD_Ifdivrp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1329 */ { UD_Ifdivrp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1330 */ { UD_Ifdivp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1331 */ { UD_Ifdivp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1332 */ { UD_Ifdivp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1333 */ { UD_Ifdivp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1334 */ { UD_Ifdivp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1335 */ { UD_Ifdivp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1336 */ { UD_Ifdivp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1337 */ { UD_Ifdivp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1338 */ { UD_Ifild, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1339 */ { UD_Ifisttp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1340 */ { UD_Ifist, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1341 */ { UD_Ifistp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1342 */ { UD_Ifbld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1343 */ { UD_Ifild, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1344 */ { UD_Ifbstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1345 */ { UD_Ifistp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1346 */ { UD_Iffreep, O_ST0, O_NONE, O_NONE, P_none }, + /* 1347 */ { UD_Iffreep, O_ST1, O_NONE, O_NONE, P_none }, + /* 1348 */ { UD_Iffreep, O_ST2, O_NONE, O_NONE, P_none }, + /* 1349 */ { UD_Iffreep, O_ST3, O_NONE, O_NONE, P_none }, + /* 1350 */ { UD_Iffreep, O_ST4, O_NONE, O_NONE, P_none }, + /* 1351 */ { UD_Iffreep, O_ST5, O_NONE, O_NONE, P_none }, + /* 1352 */ { UD_Iffreep, O_ST6, O_NONE, O_NONE, P_none }, + /* 1353 */ { UD_Iffreep, O_ST7, O_NONE, O_NONE, P_none }, + /* 1354 */ { UD_Ifxch7, O_ST0, O_NONE, O_NONE, P_none }, + /* 1355 */ { UD_Ifxch7, O_ST1, O_NONE, O_NONE, P_none }, + /* 1356 */ { UD_Ifxch7, O_ST2, O_NONE, O_NONE, P_none }, + /* 1357 */ { UD_Ifxch7, O_ST3, O_NONE, O_NONE, P_none }, + /* 1358 */ { UD_Ifxch7, O_ST4, O_NONE, O_NONE, P_none }, + /* 1359 */ { UD_Ifxch7, O_ST5, O_NONE, O_NONE, P_none }, + /* 1360 */ { UD_Ifxch7, O_ST6, O_NONE, O_NONE, P_none }, + /* 1361 */ { UD_Ifxch7, O_ST7, O_NONE, O_NONE, P_none }, + /* 1362 */ { UD_Ifstp8, O_ST0, O_NONE, O_NONE, P_none }, + /* 1363 */ { UD_Ifstp8, O_ST1, O_NONE, O_NONE, P_none }, + /* 1364 */ { UD_Ifstp8, O_ST2, O_NONE, O_NONE, P_none }, + /* 1365 */ { UD_Ifstp8, O_ST3, O_NONE, O_NONE, P_none }, + /* 1366 */ { UD_Ifstp8, O_ST4, O_NONE, O_NONE, P_none }, + /* 1367 */ { UD_Ifstp8, O_ST5, O_NONE, O_NONE, P_none }, + /* 1368 */ { UD_Ifstp8, O_ST6, O_NONE, O_NONE, P_none }, + /* 1369 */ { UD_Ifstp8, O_ST7, O_NONE, O_NONE, P_none }, + /* 1370 */ { UD_Ifstp9, O_ST0, O_NONE, O_NONE, P_none }, + /* 1371 */ { UD_Ifstp9, O_ST1, O_NONE, O_NONE, P_none }, + /* 1372 */ { UD_Ifstp9, O_ST2, O_NONE, O_NONE, P_none }, + /* 1373 */ { UD_Ifstp9, O_ST3, O_NONE, O_NONE, P_none }, + /* 1374 */ { UD_Ifstp9, O_ST4, O_NONE, O_NONE, P_none }, + /* 1375 */ { UD_Ifstp9, O_ST5, O_NONE, O_NONE, P_none }, + /* 1376 */ { UD_Ifstp9, O_ST6, O_NONE, O_NONE, P_none }, + /* 1377 */ { UD_Ifstp9, O_ST7, O_NONE, O_NONE, P_none }, + /* 1378 */ { UD_Ifnstsw, O_AX, O_NONE, O_NONE, P_none }, + /* 1379 */ { UD_Ifucomip, O_ST0, O_ST0, O_NONE, P_none }, + /* 1380 */ { UD_Ifucomip, O_ST0, O_ST1, O_NONE, P_none }, + /* 1381 */ { UD_Ifucomip, O_ST0, O_ST2, O_NONE, P_none }, + /* 1382 */ { UD_Ifucomip, O_ST0, O_ST3, O_NONE, P_none }, + /* 1383 */ { UD_Ifucomip, O_ST0, O_ST4, O_NONE, P_none }, + /* 1384 */ { UD_Ifucomip, O_ST0, O_ST5, O_NONE, P_none }, + /* 1385 */ { UD_Ifucomip, O_ST0, O_ST6, O_NONE, P_none }, + /* 1386 */ { UD_Ifucomip, O_ST0, O_ST7, O_NONE, P_none }, + /* 1387 */ { UD_Ifcomip, O_ST0, O_ST0, O_NONE, P_none }, + /* 1388 */ { UD_Ifcomip, O_ST0, O_ST1, O_NONE, P_none }, + /* 1389 */ { UD_Ifcomip, O_ST0, O_ST2, O_NONE, P_none }, + /* 1390 */ { UD_Ifcomip, O_ST0, O_ST3, O_NONE, P_none }, + /* 1391 */ { UD_Ifcomip, O_ST0, O_ST4, O_NONE, P_none }, + /* 1392 */ { UD_Ifcomip, O_ST0, O_ST5, O_NONE, P_none }, + /* 1393 */ { UD_Ifcomip, O_ST0, O_ST6, O_NONE, P_none }, + /* 1394 */ { UD_Ifcomip, O_ST0, O_ST7, O_NONE, P_none }, + /* 1395 */ { UD_Iloopne, O_Jb, O_NONE, O_NONE, P_none }, + /* 1396 */ { UD_Iloope, O_Jb, O_NONE, O_NONE, P_none }, + /* 1397 */ { UD_Iloop, O_Jb, O_NONE, O_NONE, P_none }, + /* 1398 */ { UD_Ijcxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1399 */ { UD_Ijecxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1400 */ { UD_Ijrcxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1401 */ { UD_Iin, O_AL, O_Ib, O_NONE, P_none }, + /* 1402 */ { UD_Iin, O_eAX, O_Ib, O_NONE, P_oso }, + /* 1403 */ { UD_Iout, O_Ib, O_AL, O_NONE, P_none }, + /* 1404 */ { UD_Iout, O_Ib, O_eAX, O_NONE, P_oso }, + /* 1405 */ { UD_Icall, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 1406 */ { UD_Ijmp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 1407 */ { UD_Ijmp, O_Av, O_NONE, O_NONE, P_oso }, + /* 1408 */ { UD_Ijmp, O_Jb, O_NONE, O_NONE, P_none }, + /* 1409 */ { UD_Iin, O_AL, O_DX, O_NONE, P_none }, + /* 1410 */ { UD_Iin, O_eAX, O_DX, O_NONE, P_oso }, + /* 1411 */ { UD_Iout, O_DX, O_AL, O_NONE, P_none }, + /* 1412 */ { UD_Iout, O_DX, O_eAX, O_NONE, P_oso }, + /* 1413 */ { UD_Ilock, O_NONE, O_NONE, O_NONE, P_none }, + /* 1414 */ { UD_Iint1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1415 */ { UD_Irepne, O_NONE, O_NONE, O_NONE, P_none }, + /* 1416 */ { UD_Irep, O_NONE, O_NONE, O_NONE, P_none }, + /* 1417 */ { UD_Ihlt, O_NONE, O_NONE, O_NONE, P_none }, + /* 1418 */ { UD_Icmc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1419 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1420 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1421 */ { UD_Inot, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1422 */ { UD_Ineg, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1423 */ { UD_Imul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1424 */ { UD_Iimul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1425 */ { UD_Idiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1426 */ { UD_Iidiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1427 */ { UD_Itest, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1428 */ { UD_Itest, O_Ev, O_Iz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1429 */ { UD_Inot, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1430 */ { UD_Ineg, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1431 */ { UD_Imul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1432 */ { UD_Iimul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1433 */ { UD_Idiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1434 */ { UD_Iidiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1435 */ { UD_Iclc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1436 */ { UD_Istc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1437 */ { UD_Icli, O_NONE, O_NONE, O_NONE, P_none }, + /* 1438 */ { UD_Isti, O_NONE, O_NONE, O_NONE, P_none }, + /* 1439 */ { UD_Icld, O_NONE, O_NONE, O_NONE, P_none }, + /* 1440 */ { UD_Istd, O_NONE, O_NONE, O_NONE, P_none }, + /* 1441 */ { UD_Iinc, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1442 */ { UD_Idec, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1443 */ { UD_Iinc, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1444 */ { UD_Idec, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1445 */ { UD_Icall, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1446 */ { UD_Icall, O_Eq, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 1447 */ { UD_Icall, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1448 */ { UD_Ijmp, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 1449 */ { UD_Ijmp, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1450 */ { UD_Ipush, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, +}; + + +const char * ud_mnemonics_str[] = { +"invalid", + "3dnow", + "none", + "db", + "pause", + "aaa", + "aad", + "aam", + "aas", + "adc", + "add", + "addpd", + "addps", + "addsd", + "addss", + "and", + "andpd", + "andps", + "andnpd", + "andnps", + "arpl", + "movsxd", + "bound", + "bsf", + "bsr", + "bswap", + "bt", + "btc", + "btr", + "bts", + "call", + "cbw", + "cwde", + "cdqe", + "clc", + "cld", + "clflush", + "clgi", + "cli", + "clts", + "cmc", + "cmovo", + "cmovno", + "cmovb", + "cmovae", + "cmovz", + "cmovnz", + "cmovbe", + "cmova", + "cmovs", + "cmovns", + "cmovp", + "cmovnp", + "cmovl", + "cmovge", + "cmovle", + "cmovg", + "cmp", + "cmppd", + "cmpps", + "cmpsb", + "cmpsw", + "cmpsd", + "cmpsq", + "cmpss", + "cmpxchg", + "cmpxchg8b", + "cmpxchg16b", + "comisd", + "comiss", + "cpuid", + "cvtdq2pd", + "cvtdq2ps", + "cvtpd2dq", + "cvtpd2pi", + "cvtpd2ps", + "cvtpi2ps", + "cvtpi2pd", + "cvtps2dq", + "cvtps2pi", + "cvtps2pd", + "cvtsd2si", + "cvtsd2ss", + "cvtsi2ss", + "cvtss2si", + "cvtss2sd", + "cvttpd2pi", + "cvttpd2dq", + "cvttps2dq", + "cvttps2pi", + "cvttsd2si", + "cvtsi2sd", + "cvttss2si", + "cwd", + "cdq", + "cqo", + "daa", + "das", + "dec", + "div", + "divpd", + "divps", + "divsd", + "divss", + "emms", + "enter", + "f2xm1", + "fabs", + "fadd", + "faddp", + "fbld", + "fbstp", + "fchs", + "fclex", + "fcmovb", + "fcmove", + "fcmovbe", + "fcmovu", + "fcmovnb", + "fcmovne", + "fcmovnbe", + "fcmovnu", + "fucomi", + "fcom", + "fcom2", + "fcomp3", + "fcomi", + "fucomip", + "fcomip", + "fcomp", + "fcomp5", + "fcompp", + "fcos", + "fdecstp", + "fdiv", + "fdivp", + "fdivr", + "fdivrp", + "femms", + "ffree", + "ffreep", + "ficom", + "ficomp", + "fild", + "fincstp", + "fninit", + "fiadd", + "fidivr", + "fidiv", + "fisub", + "fisubr", + "fist", + "fistp", + "fisttp", + "fld", + "fld1", + "fldl2t", + "fldl2e", + "fldpi", + "fldlg2", + "fldln2", + "fldz", + "fldcw", + "fldenv", + "fmul", + "fmulp", + "fimul", + "fnop", + "fpatan", + "fprem", + "fprem1", + "fptan", + "frndint", + "frstor", + "fnsave", + "fscale", + "fsin", + "fsincos", + "fsqrt", + "fstp", + "fstp1", + "fstp8", + "fstp9", + "fst", + "fnstcw", + "fnstenv", + "fnstsw", + "fsub", + "fsubp", + "fsubr", + "fsubrp", + "ftst", + "fucom", + "fucomp", + "fucompp", + "fxam", + "fxch", + "fxch4", + "fxch7", + "fxrstor", + "fxsave", + "fxtract", + "fyl2x", + "fyl2xp1", + "hlt", + "idiv", + "in", + "imul", + "inc", + "insb", + "insw", + "insd", + "int1", + "int3", + "int", + "into", + "invd", + "invept", + "invlpg", + "invlpga", + "invvpid", + "iretw", + "iretd", + "iretq", + "jo", + "jno", + "jb", + "jae", + "jz", + "jnz", + "jbe", + "ja", + "js", + "jns", + "jp", + "jnp", + "jl", + "jge", + "jle", + "jg", + "jcxz", + "jecxz", + "jrcxz", + "jmp", + "lahf", + "lar", + "lddqu", + "ldmxcsr", + "lds", + "lea", + "les", + "lfs", + "lgs", + "lidt", + "lss", + "leave", + "lfence", + "lgdt", + "lldt", + "lmsw", + "lock", + "lodsb", + "lodsw", + "lodsd", + "lodsq", + "loopne", + "loope", + "loop", + "lsl", + "ltr", + "maskmovq", + "maxpd", + "maxps", + "maxsd", + "maxss", + "mfence", + "minpd", + "minps", + "minsd", + "minss", + "monitor", + "montmul", + "mov", + "movapd", + "movaps", + "movd", + "movhpd", + "movhps", + "movlhps", + "movlpd", + "movlps", + "movhlps", + "movmskpd", + "movmskps", + "movntdq", + "movnti", + "movntpd", + "movntps", + "movntq", + "movq", + "movsb", + "movsw", + "movsd", + "movsq", + "movss", + "movsx", + "movupd", + "movups", + "movzx", + "mul", + "mulpd", + "mulps", + "mulsd", + "mulss", + "mwait", + "neg", + "nop", + "not", + "or", + "orpd", + "orps", + "out", + "outsb", + "outsw", + "outsd", + "packsswb", + "packssdw", + "packuswb", + "paddb", + "paddw", + "paddd", + "paddsb", + "paddsw", + "paddusb", + "paddusw", + "pand", + "pandn", + "pavgb", + "pavgw", + "pcmpeqb", + "pcmpeqw", + "pcmpeqd", + "pcmpgtb", + "pcmpgtw", + "pcmpgtd", + "pextrb", + "pextrd", + "pextrq", + "pextrw", + "pinsrb", + "pinsrw", + "pinsrd", + "pinsrq", + "pmaddwd", + "pmaxsw", + "pmaxub", + "pminsw", + "pminub", + "pmovmskb", + "pmulhuw", + "pmulhw", + "pmullw", + "pop", + "popa", + "popad", + "popfw", + "popfd", + "popfq", + "por", + "prefetch", + "prefetchnta", + "prefetcht0", + "prefetcht1", + "prefetcht2", + "psadbw", + "pshufw", + "psllw", + "pslld", + "psllq", + "psraw", + "psrad", + "psrlw", + "psrld", + "psrlq", + "psubb", + "psubw", + "psubd", + "psubsb", + "psubsw", + "psubusb", + "psubusw", + "punpckhbw", + "punpckhwd", + "punpckhdq", + "punpcklbw", + "punpcklwd", + "punpckldq", + "pi2fw", + "pi2fd", + "pf2iw", + "pf2id", + "pfnacc", + "pfpnacc", + "pfcmpge", + "pfmin", + "pfrcp", + "pfrsqrt", + "pfsub", + "pfadd", + "pfcmpgt", + "pfmax", + "pfrcpit1", + "pfrsqit1", + "pfsubr", + "pfacc", + "pfcmpeq", + "pfmul", + "pfrcpit2", + "pmulhrw", + "pswapd", + "pavgusb", + "push", + "pusha", + "pushad", + "pushfw", + "pushfd", + "pushfq", + "pxor", + "rcl", + "rcr", + "rol", + "ror", + "rcpps", + "rcpss", + "rdmsr", + "rdpmc", + "rdtsc", + "rdtscp", + "repne", + "rep", + "ret", + "retf", + "rsm", + "rsqrtps", + "rsqrtss", + "sahf", + "salc", + "sar", + "shl", + "shr", + "sbb", + "scasb", + "scasw", + "scasd", + "scasq", + "seto", + "setno", + "setb", + "setae", + "setz", + "setnz", + "setbe", + "seta", + "sets", + "setns", + "setp", + "setnp", + "setl", + "setge", + "setle", + "setg", + "sfence", + "sgdt", + "shld", + "shrd", + "shufpd", + "shufps", + "sidt", + "sldt", + "smsw", + "sqrtps", + "sqrtpd", + "sqrtsd", + "sqrtss", + "stc", + "std", + "stgi", + "sti", + "skinit", + "stmxcsr", + "stosb", + "stosw", + "stosd", + "stosq", + "str", + "sub", + "subpd", + "subps", + "subsd", + "subss", + "swapgs", + "syscall", + "sysenter", + "sysexit", + "sysret", + "test", + "ucomisd", + "ucomiss", + "ud2", + "unpckhpd", + "unpckhps", + "unpcklps", + "unpcklpd", + "verr", + "verw", + "vmcall", + "vmclear", + "vmxon", + "vmptrld", + "vmptrst", + "vmlaunch", + "vmresume", + "vmxoff", + "vmread", + "vmwrite", + "vmrun", + "vmmcall", + "vmload", + "vmsave", + "wait", + "wbinvd", + "wrmsr", + "xadd", + "xchg", + "xgetbv", + "xlatb", + "xor", + "xorpd", + "xorps", + "xcryptecb", + "xcryptcbc", + "xcryptctr", + "xcryptcfb", + "xcryptofb", + "xrstor", + "xsave", + "xsetbv", + "xsha1", + "xsha256", + "xstore", + "aesdec", + "aesdeclast", + "aesenc", + "aesenclast", + "aesimc", + "aeskeygenassist", + "pclmulqdq", + "getsec", + "movdqa", + "maskmovdqu", + "movdq2q", + "movdqu", + "movq2dq", + "paddq", + "psubq", + "pmuludq", + "pshufhw", + "pshuflw", + "pshufd", + "pslldq", + "psrldq", + "punpckhqdq", + "punpcklqdq", + "addsubpd", + "addsubps", + "haddpd", + "haddps", + "hsubpd", + "hsubps", + "movddup", + "movshdup", + "movsldup", + "pabsb", + "pabsw", + "pabsd", + "pshufb", + "phaddw", + "phaddd", + "phaddsw", + "pmaddubsw", + "phsubw", + "phsubd", + "phsubsw", + "psignb", + "psignd", + "psignw", + "pmulhrsw", + "palignr", + "pblendvb", + "pmuldq", + "pminsb", + "pminsd", + "pminuw", + "pminud", + "pmaxsb", + "pmaxsd", + "pmaxud", + "pmaxuw", + "pmulld", + "phminposuw", + "roundps", + "roundpd", + "roundss", + "roundsd", + "blendpd", + "pblendw", + "blendps", + "blendvpd", + "blendvps", + "dpps", + "dppd", + "mpsadbw", + "extractps", + "insertps", + "movntdqa", + "packusdw", + "pmovsxbw", + "pmovsxbd", + "pmovsxbq", + "pmovsxwd", + "pmovsxwq", + "pmovsxdq", + "pmovzxbw", + "pmovzxbd", + "pmovzxbq", + "pmovzxwd", + "pmovzxwq", + "pmovzxdq", + "pcmpeqq", + "popcnt", + "ptest", + "pcmpestri", + "pcmpestrm", + "pcmpgtq", + "pcmpistri", + "pcmpistrm", + "movbe", + "crc32" +}; diff --git a/Fox/Private/mach_override/libudis86/itab.h b/Fox/Private/mach_override/libudis86/itab.h new file mode 100755 index 0000000..778a76d --- /dev/null +++ b/Fox/Private/mach_override/libudis86/itab.h @@ -0,0 +1,678 @@ +#ifndef UD_ITAB_H +#define UD_ITAB_H + +/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */ + +/* ud_table_type -- lookup table types (see decode.c) */ +enum ud_table_type { + UD_TAB__OPC_TABLE, + UD_TAB__OPC_X87, + UD_TAB__OPC_MOD, + UD_TAB__OPC_VEX_M, + UD_TAB__OPC_VEX_P, + UD_TAB__OPC_RM, + UD_TAB__OPC_VENDOR, + UD_TAB__OPC_OSIZE, + UD_TAB__OPC_MODE, + UD_TAB__OPC_3DNOW, + UD_TAB__OPC_REG, + UD_TAB__OPC_ASIZE, + UD_TAB__OPC_SSE +}; + +/* ud_mnemonic -- mnemonic constants */ +enum ud_mnemonic_code { + UD_Iinvalid, + UD_I3dnow, + UD_Inone, + UD_Idb, + UD_Ipause, + UD_Iaaa, + UD_Iaad, + UD_Iaam, + UD_Iaas, + UD_Iadc, + UD_Iadd, + UD_Iaddpd, + UD_Iaddps, + UD_Iaddsd, + UD_Iaddss, + UD_Iand, + UD_Iandpd, + UD_Iandps, + UD_Iandnpd, + UD_Iandnps, + UD_Iarpl, + UD_Imovsxd, + UD_Ibound, + UD_Ibsf, + UD_Ibsr, + UD_Ibswap, + UD_Ibt, + UD_Ibtc, + UD_Ibtr, + UD_Ibts, + UD_Icall, + UD_Icbw, + UD_Icwde, + UD_Icdqe, + UD_Iclc, + UD_Icld, + UD_Iclflush, + UD_Iclgi, + UD_Icli, + UD_Iclts, + UD_Icmc, + UD_Icmovo, + UD_Icmovno, + UD_Icmovb, + UD_Icmovae, + UD_Icmovz, + UD_Icmovnz, + UD_Icmovbe, + UD_Icmova, + UD_Icmovs, + UD_Icmovns, + UD_Icmovp, + UD_Icmovnp, + UD_Icmovl, + UD_Icmovge, + UD_Icmovle, + UD_Icmovg, + UD_Icmp, + UD_Icmppd, + UD_Icmpps, + UD_Icmpsb, + UD_Icmpsw, + UD_Icmpsd, + UD_Icmpsq, + UD_Icmpss, + UD_Icmpxchg, + UD_Icmpxchg8b, + UD_Icmpxchg16b, + UD_Icomisd, + UD_Icomiss, + UD_Icpuid, + UD_Icvtdq2pd, + UD_Icvtdq2ps, + UD_Icvtpd2dq, + UD_Icvtpd2pi, + UD_Icvtpd2ps, + UD_Icvtpi2ps, + UD_Icvtpi2pd, + UD_Icvtps2dq, + UD_Icvtps2pi, + UD_Icvtps2pd, + UD_Icvtsd2si, + UD_Icvtsd2ss, + UD_Icvtsi2ss, + UD_Icvtss2si, + UD_Icvtss2sd, + UD_Icvttpd2pi, + UD_Icvttpd2dq, + UD_Icvttps2dq, + UD_Icvttps2pi, + UD_Icvttsd2si, + UD_Icvtsi2sd, + UD_Icvttss2si, + UD_Icwd, + UD_Icdq, + UD_Icqo, + UD_Idaa, + UD_Idas, + UD_Idec, + UD_Idiv, + UD_Idivpd, + UD_Idivps, + UD_Idivsd, + UD_Idivss, + UD_Iemms, + UD_Ienter, + UD_If2xm1, + UD_Ifabs, + UD_Ifadd, + UD_Ifaddp, + UD_Ifbld, + UD_Ifbstp, + UD_Ifchs, + UD_Ifclex, + UD_Ifcmovb, + UD_Ifcmove, + UD_Ifcmovbe, + UD_Ifcmovu, + UD_Ifcmovnb, + UD_Ifcmovne, + UD_Ifcmovnbe, + UD_Ifcmovnu, + UD_Ifucomi, + UD_Ifcom, + UD_Ifcom2, + UD_Ifcomp3, + UD_Ifcomi, + UD_Ifucomip, + UD_Ifcomip, + UD_Ifcomp, + UD_Ifcomp5, + UD_Ifcompp, + UD_Ifcos, + UD_Ifdecstp, + UD_Ifdiv, + UD_Ifdivp, + UD_Ifdivr, + UD_Ifdivrp, + UD_Ifemms, + UD_Iffree, + UD_Iffreep, + UD_Ificom, + UD_Ificomp, + UD_Ifild, + UD_Ifincstp, + UD_Ifninit, + UD_Ifiadd, + UD_Ifidivr, + UD_Ifidiv, + UD_Ifisub, + UD_Ifisubr, + UD_Ifist, + UD_Ifistp, + UD_Ifisttp, + UD_Ifld, + UD_Ifld1, + UD_Ifldl2t, + UD_Ifldl2e, + UD_Ifldpi, + UD_Ifldlg2, + UD_Ifldln2, + UD_Ifldz, + UD_Ifldcw, + UD_Ifldenv, + UD_Ifmul, + UD_Ifmulp, + UD_Ifimul, + UD_Ifnop, + UD_Ifpatan, + UD_Ifprem, + UD_Ifprem1, + UD_Ifptan, + UD_Ifrndint, + UD_Ifrstor, + UD_Ifnsave, + UD_Ifscale, + UD_Ifsin, + UD_Ifsincos, + UD_Ifsqrt, + UD_Ifstp, + UD_Ifstp1, + UD_Ifstp8, + UD_Ifstp9, + UD_Ifst, + UD_Ifnstcw, + UD_Ifnstenv, + UD_Ifnstsw, + UD_Ifsub, + UD_Ifsubp, + UD_Ifsubr, + UD_Ifsubrp, + UD_Iftst, + UD_Ifucom, + UD_Ifucomp, + UD_Ifucompp, + UD_Ifxam, + UD_Ifxch, + UD_Ifxch4, + UD_Ifxch7, + UD_Ifxrstor, + UD_Ifxsave, + UD_Ifxtract, + UD_Ifyl2x, + UD_Ifyl2xp1, + UD_Ihlt, + UD_Iidiv, + UD_Iin, + UD_Iimul, + UD_Iinc, + UD_Iinsb, + UD_Iinsw, + UD_Iinsd, + UD_Iint1, + UD_Iint3, + UD_Iint, + UD_Iinto, + UD_Iinvd, + UD_Iinvept, + UD_Iinvlpg, + UD_Iinvlpga, + UD_Iinvvpid, + UD_Iiretw, + UD_Iiretd, + UD_Iiretq, + UD_Ijo, + UD_Ijno, + UD_Ijb, + UD_Ijae, + UD_Ijz, + UD_Ijnz, + UD_Ijbe, + UD_Ija, + UD_Ijs, + UD_Ijns, + UD_Ijp, + UD_Ijnp, + UD_Ijl, + UD_Ijge, + UD_Ijle, + UD_Ijg, + UD_Ijcxz, + UD_Ijecxz, + UD_Ijrcxz, + UD_Ijmp, + UD_Ilahf, + UD_Ilar, + UD_Ilddqu, + UD_Ildmxcsr, + UD_Ilds, + UD_Ilea, + UD_Iles, + UD_Ilfs, + UD_Ilgs, + UD_Ilidt, + UD_Ilss, + UD_Ileave, + UD_Ilfence, + UD_Ilgdt, + UD_Illdt, + UD_Ilmsw, + UD_Ilock, + UD_Ilodsb, + UD_Ilodsw, + UD_Ilodsd, + UD_Ilodsq, + UD_Iloopne, + UD_Iloope, + UD_Iloop, + UD_Ilsl, + UD_Iltr, + UD_Imaskmovq, + UD_Imaxpd, + UD_Imaxps, + UD_Imaxsd, + UD_Imaxss, + UD_Imfence, + UD_Iminpd, + UD_Iminps, + UD_Iminsd, + UD_Iminss, + UD_Imonitor, + UD_Imontmul, + UD_Imov, + UD_Imovapd, + UD_Imovaps, + UD_Imovd, + UD_Imovhpd, + UD_Imovhps, + UD_Imovlhps, + UD_Imovlpd, + UD_Imovlps, + UD_Imovhlps, + UD_Imovmskpd, + UD_Imovmskps, + UD_Imovntdq, + UD_Imovnti, + UD_Imovntpd, + UD_Imovntps, + UD_Imovntq, + UD_Imovq, + UD_Imovsb, + UD_Imovsw, + UD_Imovsd, + UD_Imovsq, + UD_Imovss, + UD_Imovsx, + UD_Imovupd, + UD_Imovups, + UD_Imovzx, + UD_Imul, + UD_Imulpd, + UD_Imulps, + UD_Imulsd, + UD_Imulss, + UD_Imwait, + UD_Ineg, + UD_Inop, + UD_Inot, + UD_Ior, + UD_Iorpd, + UD_Iorps, + UD_Iout, + UD_Ioutsb, + UD_Ioutsw, + UD_Ioutsd, + UD_Ipacksswb, + UD_Ipackssdw, + UD_Ipackuswb, + UD_Ipaddb, + UD_Ipaddw, + UD_Ipaddd, + UD_Ipaddsb, + UD_Ipaddsw, + UD_Ipaddusb, + UD_Ipaddusw, + UD_Ipand, + UD_Ipandn, + UD_Ipavgb, + UD_Ipavgw, + UD_Ipcmpeqb, + UD_Ipcmpeqw, + UD_Ipcmpeqd, + UD_Ipcmpgtb, + UD_Ipcmpgtw, + UD_Ipcmpgtd, + UD_Ipextrb, + UD_Ipextrd, + UD_Ipextrq, + UD_Ipextrw, + UD_Ipinsrb, + UD_Ipinsrw, + UD_Ipinsrd, + UD_Ipinsrq, + UD_Ipmaddwd, + UD_Ipmaxsw, + UD_Ipmaxub, + UD_Ipminsw, + UD_Ipminub, + UD_Ipmovmskb, + UD_Ipmulhuw, + UD_Ipmulhw, + UD_Ipmullw, + UD_Ipop, + UD_Ipopa, + UD_Ipopad, + UD_Ipopfw, + UD_Ipopfd, + UD_Ipopfq, + UD_Ipor, + UD_Iprefetch, + UD_Iprefetchnta, + UD_Iprefetcht0, + UD_Iprefetcht1, + UD_Iprefetcht2, + UD_Ipsadbw, + UD_Ipshufw, + UD_Ipsllw, + UD_Ipslld, + UD_Ipsllq, + UD_Ipsraw, + UD_Ipsrad, + UD_Ipsrlw, + UD_Ipsrld, + UD_Ipsrlq, + UD_Ipsubb, + UD_Ipsubw, + UD_Ipsubd, + UD_Ipsubsb, + UD_Ipsubsw, + UD_Ipsubusb, + UD_Ipsubusw, + UD_Ipunpckhbw, + UD_Ipunpckhwd, + UD_Ipunpckhdq, + UD_Ipunpcklbw, + UD_Ipunpcklwd, + UD_Ipunpckldq, + UD_Ipi2fw, + UD_Ipi2fd, + UD_Ipf2iw, + UD_Ipf2id, + UD_Ipfnacc, + UD_Ipfpnacc, + UD_Ipfcmpge, + UD_Ipfmin, + UD_Ipfrcp, + UD_Ipfrsqrt, + UD_Ipfsub, + UD_Ipfadd, + UD_Ipfcmpgt, + UD_Ipfmax, + UD_Ipfrcpit1, + UD_Ipfrsqit1, + UD_Ipfsubr, + UD_Ipfacc, + UD_Ipfcmpeq, + UD_Ipfmul, + UD_Ipfrcpit2, + UD_Ipmulhrw, + UD_Ipswapd, + UD_Ipavgusb, + UD_Ipush, + UD_Ipusha, + UD_Ipushad, + UD_Ipushfw, + UD_Ipushfd, + UD_Ipushfq, + UD_Ipxor, + UD_Ircl, + UD_Ircr, + UD_Irol, + UD_Iror, + UD_Ircpps, + UD_Ircpss, + UD_Irdmsr, + UD_Irdpmc, + UD_Irdtsc, + UD_Irdtscp, + UD_Irepne, + UD_Irep, + UD_Iret, + UD_Iretf, + UD_Irsm, + UD_Irsqrtps, + UD_Irsqrtss, + UD_Isahf, + UD_Isalc, + UD_Isar, + UD_Ishl, + UD_Ishr, + UD_Isbb, + UD_Iscasb, + UD_Iscasw, + UD_Iscasd, + UD_Iscasq, + UD_Iseto, + UD_Isetno, + UD_Isetb, + UD_Isetae, + UD_Isetz, + UD_Isetnz, + UD_Isetbe, + UD_Iseta, + UD_Isets, + UD_Isetns, + UD_Isetp, + UD_Isetnp, + UD_Isetl, + UD_Isetge, + UD_Isetle, + UD_Isetg, + UD_Isfence, + UD_Isgdt, + UD_Ishld, + UD_Ishrd, + UD_Ishufpd, + UD_Ishufps, + UD_Isidt, + UD_Isldt, + UD_Ismsw, + UD_Isqrtps, + UD_Isqrtpd, + UD_Isqrtsd, + UD_Isqrtss, + UD_Istc, + UD_Istd, + UD_Istgi, + UD_Isti, + UD_Iskinit, + UD_Istmxcsr, + UD_Istosb, + UD_Istosw, + UD_Istosd, + UD_Istosq, + UD_Istr, + UD_Isub, + UD_Isubpd, + UD_Isubps, + UD_Isubsd, + UD_Isubss, + UD_Iswapgs, + UD_Isyscall, + UD_Isysenter, + UD_Isysexit, + UD_Isysret, + UD_Itest, + UD_Iucomisd, + UD_Iucomiss, + UD_Iud2, + UD_Iunpckhpd, + UD_Iunpckhps, + UD_Iunpcklps, + UD_Iunpcklpd, + UD_Iverr, + UD_Iverw, + UD_Ivmcall, + UD_Ivmclear, + UD_Ivmxon, + UD_Ivmptrld, + UD_Ivmptrst, + UD_Ivmlaunch, + UD_Ivmresume, + UD_Ivmxoff, + UD_Ivmread, + UD_Ivmwrite, + UD_Ivmrun, + UD_Ivmmcall, + UD_Ivmload, + UD_Ivmsave, + UD_Iwait, + UD_Iwbinvd, + UD_Iwrmsr, + UD_Ixadd, + UD_Ixchg, + UD_Ixgetbv, + UD_Ixlatb, + UD_Ixor, + UD_Ixorpd, + UD_Ixorps, + UD_Ixcryptecb, + UD_Ixcryptcbc, + UD_Ixcryptctr, + UD_Ixcryptcfb, + UD_Ixcryptofb, + UD_Ixrstor, + UD_Ixsave, + UD_Ixsetbv, + UD_Ixsha1, + UD_Ixsha256, + UD_Ixstore, + UD_Iaesdec, + UD_Iaesdeclast, + UD_Iaesenc, + UD_Iaesenclast, + UD_Iaesimc, + UD_Iaeskeygenassist, + UD_Ipclmulqdq, + UD_Igetsec, + UD_Imovdqa, + UD_Imaskmovdqu, + UD_Imovdq2q, + UD_Imovdqu, + UD_Imovq2dq, + UD_Ipaddq, + UD_Ipsubq, + UD_Ipmuludq, + UD_Ipshufhw, + UD_Ipshuflw, + UD_Ipshufd, + UD_Ipslldq, + UD_Ipsrldq, + UD_Ipunpckhqdq, + UD_Ipunpcklqdq, + UD_Iaddsubpd, + UD_Iaddsubps, + UD_Ihaddpd, + UD_Ihaddps, + UD_Ihsubpd, + UD_Ihsubps, + UD_Imovddup, + UD_Imovshdup, + UD_Imovsldup, + UD_Ipabsb, + UD_Ipabsw, + UD_Ipabsd, + UD_Ipshufb, + UD_Iphaddw, + UD_Iphaddd, + UD_Iphaddsw, + UD_Ipmaddubsw, + UD_Iphsubw, + UD_Iphsubd, + UD_Iphsubsw, + UD_Ipsignb, + UD_Ipsignd, + UD_Ipsignw, + UD_Ipmulhrsw, + UD_Ipalignr, + UD_Ipblendvb, + UD_Ipmuldq, + UD_Ipminsb, + UD_Ipminsd, + UD_Ipminuw, + UD_Ipminud, + UD_Ipmaxsb, + UD_Ipmaxsd, + UD_Ipmaxud, + UD_Ipmaxuw, + UD_Ipmulld, + UD_Iphminposuw, + UD_Iroundps, + UD_Iroundpd, + UD_Iroundss, + UD_Iroundsd, + UD_Iblendpd, + UD_Ipblendw, + UD_Iblendps, + UD_Iblendvpd, + UD_Iblendvps, + UD_Idpps, + UD_Idppd, + UD_Impsadbw, + UD_Iextractps, + UD_Iinsertps, + UD_Imovntdqa, + UD_Ipackusdw, + UD_Ipmovsxbw, + UD_Ipmovsxbd, + UD_Ipmovsxbq, + UD_Ipmovsxwd, + UD_Ipmovsxwq, + UD_Ipmovsxdq, + UD_Ipmovzxbw, + UD_Ipmovzxbd, + UD_Ipmovzxbq, + UD_Ipmovzxwd, + UD_Ipmovzxwq, + UD_Ipmovzxdq, + UD_Ipcmpeqq, + UD_Ipopcnt, + UD_Iptest, + UD_Ipcmpestri, + UD_Ipcmpestrm, + UD_Ipcmpgtq, + UD_Ipcmpistri, + UD_Ipcmpistrm, + UD_Imovbe, + UD_Icrc32, + UD_MAX_MNEMONIC_CODE +} UD_ATTR_PACKED; + +extern const char * ud_mnemonics_str[]; + +#endif /* UD_ITAB_H */ diff --git a/Fox/Private/mach_override/libudis86/syn-att.c b/Fox/Private/mach_override/libudis86/syn-att.c new file mode 100755 index 0000000..4fc17d1 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/syn-att.c @@ -0,0 +1,223 @@ +/* udis86 - libudis86/syn-att.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "extern.h" +#include "decode.h" +#include "itab.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * opr_cast() - Prints an operand cast. + * ----------------------------------------------------------------------------- + */ +static void +opr_cast(struct ud* u, struct ud_operand* op) +{ + switch(op->size) { + case 16 : case 32 : + ud_asmprintf(u, "*"); break; + default: break; + } +} + +/* ----------------------------------------------------------------------------- + * gen_operand() - Generates assembly output for each operand. + * ----------------------------------------------------------------------------- + */ +static void +gen_operand(struct ud* u, struct ud_operand* op) +{ + switch(op->type) { + case UD_OP_CONST: + ud_asmprintf(u, "$0x%x", op->lval.udword); + break; + + case UD_OP_REG: + ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]); + break; + + case UD_OP_MEM: + if (u->br_far) { + opr_cast(u, op); + } + if (u->pfx_seg) { + ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + if (op->offset != 0) { + ud_syn_print_mem_disp(u, op, 0); + } + if (op->base) { + ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); + } + if (op->index) { + if (op->base) { + ud_asmprintf(u, ","); + } else { + ud_asmprintf(u, "("); + } + ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]); + } + if (op->scale) { + ud_asmprintf(u, ",%d", op->scale); + } + if (op->base || op->index) { + ud_asmprintf(u, ")"); + } + break; + + case UD_OP_IMM: + ud_syn_print_imm(u, op); + break; + + case UD_OP_JIMM: + ud_syn_print_addr(u, ud_syn_rel_target(u, op)); + break; + + case UD_OP_PTR: + switch (op->size) { + case 32: + ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, + op->lval.ptr.off & 0xFFFF); + break; + case 48: + ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, + op->lval.ptr.off); + break; + } + break; + + default: return; + } +} + +/* ============================================================================= + * translates to AT&T syntax + * ============================================================================= + */ +extern void +ud_translate_att(struct ud *u) +{ + int size = 0; + int star = 0; + + /* check if P_OSO prefix is used */ + if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) { + switch (u->dis_mode) { + case 16: + ud_asmprintf(u, "o32 "); + break; + case 32: + case 64: + ud_asmprintf(u, "o16 "); + break; + } + } + + /* check if P_ASO prefix was used */ + if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) { + switch (u->dis_mode) { + case 16: + ud_asmprintf(u, "a32 "); + break; + case 32: + ud_asmprintf(u, "a16 "); + break; + case 64: + ud_asmprintf(u, "a32 "); + break; + } + } + + if (u->pfx_lock) + ud_asmprintf(u, "lock "); + if (u->pfx_rep) { + ud_asmprintf(u, "rep "); + } else if (u->pfx_rep) { + ud_asmprintf(u, "repe "); + } else if (u->pfx_repne) { + ud_asmprintf(u, "repne "); + } + + /* special instructions */ + switch (u->mnemonic) { + case UD_Iretf: + ud_asmprintf(u, "lret "); + break; + case UD_Idb: + ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte); + return; + case UD_Ijmp: + case UD_Icall: + if (u->br_far) ud_asmprintf(u, "l"); + if (u->operand[0].type == UD_OP_REG) { + star = 1; + } + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + break; + case UD_Ibound: + case UD_Ienter: + if (u->operand[0].type != UD_NONE) + gen_operand(u, &u->operand[0]); + if (u->operand[1].type != UD_NONE) { + ud_asmprintf(u, ","); + gen_operand(u, &u->operand[1]); + } + return; + default: + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + } + + if (size == 8) + ud_asmprintf(u, "b"); + else if (size == 16) + ud_asmprintf(u, "w"); + else if (size == 64) + ud_asmprintf(u, "q"); + + if (star) { + ud_asmprintf(u, " *"); + } else { + ud_asmprintf(u, " "); + } + + if (u->operand[2].type != UD_NONE) { + gen_operand(u, &u->operand[2]); + ud_asmprintf(u, ", "); + } + + if (u->operand[1].type != UD_NONE) { + gen_operand(u, &u->operand[1]); + ud_asmprintf(u, ", "); + } + + if (u->operand[0].type != UD_NONE) + gen_operand(u, &u->operand[0]); +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/syn-intel.c b/Fox/Private/mach_override/libudis86/syn-intel.c new file mode 100755 index 0000000..e4d8409 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/syn-intel.c @@ -0,0 +1,213 @@ +/* udis86 - libudis86/syn-intel.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "extern.h" +#include "decode.h" +#include "itab.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * opr_cast() - Prints an operand cast. + * ----------------------------------------------------------------------------- + */ +static void +opr_cast(struct ud* u, struct ud_operand* op) +{ + if (u->br_far) { + ud_asmprintf(u, "far "); + } + switch(op->size) { + case 8: ud_asmprintf(u, "byte " ); break; + case 16: ud_asmprintf(u, "word " ); break; + case 32: ud_asmprintf(u, "dword "); break; + case 64: ud_asmprintf(u, "qword "); break; + case 80: ud_asmprintf(u, "tword "); break; + default: break; + } +} + +/* ----------------------------------------------------------------------------- + * gen_operand() - Generates assembly output for each operand. + * ----------------------------------------------------------------------------- + */ +static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) +{ + switch(op->type) { + case UD_OP_REG: + ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); + break; + + case UD_OP_MEM: + if (syn_cast) { + opr_cast(u, op); + } + ud_asmprintf(u, "["); + if (u->pfx_seg) { + ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + if (op->base) { + ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); + } + if (op->index) { + ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "", + ud_reg_tab[op->index - UD_R_AL]); + if (op->scale) { + ud_asmprintf(u, "*%d", op->scale); + } + } + if (op->offset != 0) { + ud_syn_print_mem_disp(u, op, (op->base != UD_NONE || + op->index != UD_NONE) ? 1 : 0); + } + ud_asmprintf(u, "]"); + break; + + case UD_OP_IMM: + ud_syn_print_imm(u, op); + break; + + + case UD_OP_JIMM: + ud_syn_print_addr(u, ud_syn_rel_target(u, op)); + break; + + case UD_OP_PTR: + switch (op->size) { + case 32: + ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg, + op->lval.ptr.off & 0xFFFF); + break; + case 48: + ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg, + op->lval.ptr.off); + break; + } + break; + + case UD_OP_CONST: + if (syn_cast) opr_cast(u, op); + ud_asmprintf(u, "%d", op->lval.udword); + break; + + default: return; + } +} + +/* ============================================================================= + * translates to intel syntax + * ============================================================================= + */ +extern void +ud_translate_intel(struct ud* u) +{ + /* check if P_OSO prefix is used */ + if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) { + switch (u->dis_mode) { + case 16: ud_asmprintf(u, "o32 "); break; + case 32: + case 64: ud_asmprintf(u, "o16 "); break; + } + } + + /* check if P_ASO prefix was used */ + if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) { + switch (u->dis_mode) { + case 16: ud_asmprintf(u, "a32 "); break; + case 32: ud_asmprintf(u, "a16 "); break; + case 64: ud_asmprintf(u, "a32 "); break; + } + } + + if (u->pfx_seg && + u->operand[0].type != UD_OP_MEM && + u->operand[1].type != UD_OP_MEM ) { + ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + + if (u->pfx_lock) { + ud_asmprintf(u, "lock "); + } + if (u->pfx_rep) { + ud_asmprintf(u, "rep "); + } else if (u->pfx_repe) { + ud_asmprintf(u, "repe "); + } else if (u->pfx_repne) { + ud_asmprintf(u, "repne "); + } + + /* print the instruction mnemonic */ + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + + if (u->operand[0].type != UD_NONE) { + int cast = 0; + ud_asmprintf(u, " "); + if (u->operand[0].type == UD_OP_MEM) { + if (u->operand[1].type == UD_OP_IMM || + u->operand[1].type == UD_OP_CONST || + u->operand[1].type == UD_NONE || + (u->operand[0].size != u->operand[1].size && + u->operand[1].type != UD_OP_REG)) { + cast = 1; + } else if (u->operand[1].type == UD_OP_REG && + u->operand[1].base == UD_R_CL) { + switch (u->mnemonic) { + case UD_Ircl: + case UD_Irol: + case UD_Iror: + case UD_Ircr: + case UD_Ishl: + case UD_Ishr: + case UD_Isar: + cast = 1; + break; + default: break; + } + } + } + gen_operand(u, &u->operand[0], cast); + } + + if (u->operand[1].type != UD_NONE) { + int cast = 0; + ud_asmprintf(u, ", "); + if (u->operand[1].type == UD_OP_MEM && + u->operand[0].size != u->operand[1].size && + !ud_opr_is_sreg(&u->operand[0])) { + cast = 1; + } + gen_operand(u, &u->operand[1], cast); + } + + if (u->operand[2].type != UD_NONE) { + ud_asmprintf(u, ", "); + gen_operand(u, &u->operand[2], 0); + } +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/syn.c b/Fox/Private/mach_override/libudis86/syn.c new file mode 100755 index 0000000..dc04016 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/syn.c @@ -0,0 +1,207 @@ +/* udis86 - libudis86/syn.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "decode.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * Intel Register Table - Order Matters (types.h)! + * ----------------------------------------------------------------------------- + */ +const char* ud_reg_tab[] = +{ + "al", "cl", "dl", "bl", + "ah", "ch", "dh", "bh", + "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", + "r12b", "r13b", "r14b", "r15b", + + "ax", "cx", "dx", "bx", + "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", + "r12w", "r13w" , "r14w", "r15w", + + "eax", "ecx", "edx", "ebx", + "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", + "r12d", "r13d", "r14d", "r15d", + + "rax", "rcx", "rdx", "rbx", + "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", + "r12", "r13", "r14", "r15", + + "es", "cs", "ss", "ds", + "fs", "gs", + + "cr0", "cr1", "cr2", "cr3", + "cr4", "cr5", "cr6", "cr7", + "cr8", "cr9", "cr10", "cr11", + "cr12", "cr13", "cr14", "cr15", + + "dr0", "dr1", "dr2", "dr3", + "dr4", "dr5", "dr6", "dr7", + "dr8", "dr9", "dr10", "dr11", + "dr12", "dr13", "dr14", "dr15", + + "mm0", "mm1", "mm2", "mm3", + "mm4", "mm5", "mm6", "mm7", + + "st0", "st1", "st2", "st3", + "st4", "st5", "st6", "st7", + + "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8", "xmm9", "xmm10", "xmm11", + "xmm12", "xmm13", "xmm14", "xmm15", + + "rip" +}; + + +uint64_t +ud_syn_rel_target(struct ud *u, struct ud_operand *opr) +{ + const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode); + switch (opr->size) { + case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask; + case 16: return (u->pc + opr->lval.sword) & trunc_mask; + case 32: return (u->pc + opr->lval.sdword) & trunc_mask; + default: UD_ASSERT(!"invalid relative offset size."); + } + return 0; +} + + +/* + * asmprintf + * Printf style function for printing translated assembly + * output. Returns the number of characters written and + * moves the buffer pointer forward. On an overflow, + * returns a negative number and truncates the output. + */ +int +ud_asmprintf(struct ud *u, char *fmt, ...) +{ + int ret; + int avail; + va_list ap; + va_start(ap, fmt); + avail = (int)(u->asm_buf_size - u->asm_buf_fill - 1) /* nullchar */; + ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap); + if (ret < 0 || ret > avail) { + u->asm_buf_fill = u->asm_buf_size - 1; + } else { + u->asm_buf_fill += ret; + } + va_end(ap); + return ret; +} + + +void +ud_syn_print_addr(struct ud *u, uint64_t addr) +{ + const char *name = NULL; + if (u->sym_resolver) { + int64_t offset = 0; + name = u->sym_resolver(u, addr, &offset); + if (name) { + if (offset) { + ud_asmprintf(u, "%s%+" FMT64 "d", name, offset); + } else { + ud_asmprintf(u, "%s", name); + } + return; + } + } + ud_asmprintf(u, "0x%" FMT64 "x", addr); +} + + +void +ud_syn_print_imm(struct ud* u, const struct ud_operand *op) +{ + uint64_t v; + if (op->_oprcode == OP_sI && op->size != u->opr_mode) { + if (op->size == 8) { + v = (int64_t)op->lval.sbyte; + } else { + UD_ASSERT(op->size == 32); + v = (int64_t)op->lval.sdword; + } + if (u->opr_mode < 64) { + v = v & ((1ull << u->opr_mode) - 1ull); + } + } else { + switch (op->size) { + case 8 : v = op->lval.ubyte; break; + case 16: v = op->lval.uword; break; + case 32: v = op->lval.udword; break; + case 64: v = op->lval.uqword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + } + ud_asmprintf(u, "0x%" FMT64 "x", v); +} + + +void +ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign) +{ + UD_ASSERT(op->offset != 0); + if (op->base == UD_NONE && op->index == UD_NONE) { + uint64_t v; + UD_ASSERT(op->scale == UD_NONE && op->offset != 8); + /* unsigned mem-offset */ + switch (op->offset) { + case 16: v = op->lval.uword; break; + case 32: v = op->lval.udword; break; + case 64: v = op->lval.uqword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + ud_asmprintf(u, "0x%" FMT64 "x", v); + } else { + int64_t v; + UD_ASSERT(op->offset != 64); + switch (op->offset) { + case 8 : v = op->lval.sbyte; break; + case 16: v = op->lval.sword; break; + case 32: v = op->lval.sdword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + if (v < 0) { + ud_asmprintf(u, "-0x%" FMT64 "x", -v); + } else if (v > 0) { + ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v); + } + } +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/syn.h b/Fox/Private/mach_override/libudis86/syn.h new file mode 100755 index 0000000..3e4933e --- /dev/null +++ b/Fox/Private/mach_override/libudis86/syn.h @@ -0,0 +1,53 @@ +/* udis86 - libudis86/syn.h + * + * Copyright (c) 2002-2009 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_SYN_H +#define UD_SYN_H + +#include "types.h" +#ifndef __UD_STANDALONE__ +# include +#endif /* __UD_STANDALONE__ */ + +extern const char* ud_reg_tab[]; + +uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*); + +#ifdef __GNUC__ +int ud_asmprintf(struct ud *u, char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +#else +int ud_asmprintf(struct ud *u, char *fmt, ...); +#endif + +void ud_syn_print_addr(struct ud *u, uint64_t addr); +void ud_syn_print_imm(struct ud* u, const struct ud_operand *op); +void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign); + +#endif /* UD_SYN_H */ + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/types.h b/Fox/Private/mach_override/libudis86/types.h new file mode 100755 index 0000000..bdfd4d9 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/types.h @@ -0,0 +1,253 @@ +/* udis86 - libudis86/types.h + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_TYPES_H +#define UD_TYPES_H + +#ifdef __KERNEL__ + /* -D__KERNEL__ is automatically passed on the command line when + building something as part of the Linux kernel */ +# include +# include +# ifndef __UD_STANDALONE__ +# define __UD_STANDALONE__ 1 +#endif +#endif /* __KERNEL__ */ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +# include +# include +# define inline __inline /* MS Visual Studio requires __inline + instead of inline for C code */ +#elif !defined(__UD_STANDALONE__) +# include +# include +#endif /* !__UD_STANDALONE__ */ + +/* gcc specific extensions */ +#ifdef __GNUC__ +# define UD_ATTR_PACKED __attribute__((packed)) +#else +# define UD_ATTR_PACKED +#endif /* UD_ATTR_PACKED */ + + +/* ----------------------------------------------------------------------------- + * All possible "types" of objects in udis86. Order is Important! + * ----------------------------------------------------------------------------- + */ +enum ud_type +{ + UD_NONE, + + /* 8 bit GPRs */ + UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL, + UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH, + UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL, + UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B, + UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B, + + /* 16 bit GPRs */ + UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX, + UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI, + UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W, + UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W, + + /* 32 bit GPRs */ + UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX, + UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI, + UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D, + UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D, + + /* 64 bit GPRs */ + UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX, + UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI, + UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11, + UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15, + + /* segment registers */ + UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, + UD_R_FS, UD_R_GS, + + /* control registers*/ + UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3, + UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7, + UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11, + UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15, + + /* debug registers */ + UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3, + UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7, + UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11, + UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15, + + /* mmx registers */ + UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, + UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, + + /* x87 registers */ + UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, + UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, + + /* extended multimedia registers */ + UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3, + UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7, + UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11, + UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15, + + UD_R_RIP, + + /* Operand Types */ + UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, + UD_OP_JIMM, UD_OP_CONST +}; + +#include "itab.h" + +union ud_lval { + int8_t sbyte; + uint8_t ubyte; + int16_t sword; + uint16_t uword; + int32_t sdword; + uint32_t udword; + int64_t sqword; + uint64_t uqword; + struct { + uint16_t seg; + uint32_t off; + } ptr; +}; + +/* ----------------------------------------------------------------------------- + * struct ud_operand - Disassembled instruction Operand. + * ----------------------------------------------------------------------------- + */ +struct ud_operand { + enum ud_type type; + uint8_t size; + enum ud_type base; + enum ud_type index; + uint8_t scale; + uint8_t offset; + union ud_lval lval; + uint64_t disp; + /* + * internal use only + */ + uint8_t _oprcode; +}; + +/* ----------------------------------------------------------------------------- + * struct ud - The udis86 object. + * ----------------------------------------------------------------------------- + */ +struct ud +{ + /* + * input buffering + */ + int (*inp_hook) (struct ud*); +#ifndef __UD_STANDALONE__ + FILE* inp_file; +#endif + uint8_t inp_curr; + uint8_t inp_fill; + uint8_t inp_ctr; + const uint8_t* inp_buff; + const uint8_t* inp_buff_end; + uint8_t inp_end; + uint8_t inp_cache[256]; + uint8_t inp_sess[64]; + + void (*translator)(struct ud*); + uint64_t insn_offset; + char insn_hexcode[64]; + + /* + * Assembly output buffer + */ + char *asm_buf; + size_t asm_buf_size; + size_t asm_buf_fill; + char asm_buf_int[128]; + + /* + * Symbol resolver for use in the translation phase. + */ + const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset); + + uint8_t dis_mode; + uint64_t pc; + uint8_t vendor; + enum ud_mnemonic_code mnemonic; + struct ud_operand operand[3]; + uint8_t error; + uint8_t pfx_rex; + uint8_t pfx_seg; + uint8_t pfx_opr; + uint8_t pfx_adr; + uint8_t pfx_lock; + uint8_t pfx_str; + uint8_t pfx_rep; + uint8_t pfx_repe; + uint8_t pfx_repne; + uint8_t default64; + uint8_t opr_mode; + uint8_t adr_mode; + uint8_t br_far; + uint8_t br_near; + uint8_t implicit_addr; + uint8_t have_modrm; + uint8_t modrm; + uint8_t primary_opcode; + void * user_opaque_data; + struct ud_itab_entry * itab_entry; + struct ud_lookup_table_list_entry *le; +}; + +/* ----------------------------------------------------------------------------- + * Type-definitions + * ----------------------------------------------------------------------------- + */ +typedef enum ud_type ud_type_t; +typedef enum ud_mnemonic_code ud_mnemonic_code_t; + +typedef struct ud ud_t; +typedef struct ud_operand ud_operand_t; + +#define UD_SYN_INTEL ud_translate_intel +#define UD_SYN_ATT ud_translate_att +#define UD_EOI (-1) +#define UD_INP_CACHE_SZ 32 +#define UD_VENDOR_AMD 0 +#define UD_VENDOR_INTEL 1 +#define UD_VENDOR_ANY 2 + +#endif + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/libudis86/udint.h b/Fox/Private/mach_override/libudis86/udint.h new file mode 100755 index 0000000..92b8019 --- /dev/null +++ b/Fox/Private/mach_override/libudis86/udint.h @@ -0,0 +1,83 @@ +/* udis86 - libudis86/udint.h -- definitions for internal use only + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _UDINT_H_ +#define _UDINT_H_ + +#ifdef HAVE_CONFIG_H +# include +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_ASSERT_H +# include +# define UD_ASSERT(_x) assert(_x) +#else +# define UD_ASSERT(_x) +#endif /* !HAVE_ASSERT_H */ + +#ifdef LOGERR + #define UDERR(u, msg) \ + do { \ + (u)->error = 1; \ + fprintf(stderr, "decode-error: %s:%d: %s", \ + __FILE__, __LINE__, (msg)); \ + } while (0) +#else + #define UDERR(u, m) \ + do { \ + (u)->error = 1; \ + } while (0) +#endif /* !LOGERR */ + +#define UD_RETURN_ON_ERROR(u) \ + do { \ + if ((u)->error != 0) { \ + return (u)->error; \ + } \ + } while (0) + +#define UD_RETURN_WITH_ERROR(u, m) \ + do { \ + UDERR(u, m); \ + return (u)->error; \ + } while (0) + +/* printf formatting int64 specifier */ +#ifdef FMT64 +# undef FMT64 +#endif +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define FMT64 "I64" +#else +# if defined(__APPLE__) +# define FMT64 "ll" +# elif defined(__amd64__) || defined(__x86_64__) +# define FMT64 "l" +# else +# define FMT64 "ll" +# endif /* !x64 */ +#endif + +#endif /* _UDINT_H_ */ diff --git a/Fox/Private/mach_override/libudis86/udis86.c b/Fox/Private/mach_override/libudis86/udis86.c new file mode 100755 index 0000000..bc3ddeb --- /dev/null +++ b/Fox/Private/mach_override/libudis86/udis86.c @@ -0,0 +1,301 @@ +/* udis86 - libudis86/udis86.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "input.h" +#include "extern.h" +#include "decode.h" +#include +#include + +/* ============================================================================= + * ud_init() - Initializes ud_t object. + * ============================================================================= + */ +extern void +ud_init(struct ud* u) +{ + memset((void*)u, 0, sizeof(struct ud)); + ud_set_mode(u, 16); + u->mnemonic = UD_Iinvalid; + ud_set_pc(u, 0); +#ifndef __UD_STANDALONE__ + ud_set_input_file(u, stdin); +#endif /* __UD_STANDALONE__ */ + + ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); +} + +/* ============================================================================= + * ud_disassemble() - disassembles one instruction and returns the number of + * bytes disassembled. A zero means end of disassembly. + * ============================================================================= + */ +extern unsigned int +ud_disassemble(struct ud* u) +{ + if (ud_input_end(u)) + return 0; + + u->asm_buf[0] = 0; + + if (ud_decode(u) == 0) + return 0; + if (u->translator) + u->translator(u); + return ud_insn_len(u); +} + +/* ============================================================================= + * ud_set_mode() - Set Disassemly Mode. + * ============================================================================= + */ +extern void +ud_set_mode(struct ud* u, uint8_t m) +{ + switch(m) { + case 16: + case 32: + case 64: u->dis_mode = m ; return; + default: u->dis_mode = 16; return; + } +} + +/* ============================================================================= + * ud_set_vendor() - Set vendor. + * ============================================================================= + */ +extern void +ud_set_vendor(struct ud* u, unsigned v) +{ + switch(v) { + case UD_VENDOR_INTEL: + u->vendor = v; + break; + case UD_VENDOR_ANY: + u->vendor = v; + break; + default: + u->vendor = UD_VENDOR_AMD; + } +} + +/* ============================================================================= + * ud_set_pc() - Sets code origin. + * ============================================================================= + */ +extern void +ud_set_pc(struct ud* u, uint64_t o) +{ + u->pc = o; +} + +/* ============================================================================= + * ud_set_syntax() - Sets the output syntax. + * ============================================================================= + */ +extern void +ud_set_syntax(struct ud* u, void (*t)(struct ud*)) +{ + u->translator = t; +} + +/* ============================================================================= + * ud_insn() - returns the disassembled instruction + * ============================================================================= + */ +const char* +ud_insn_asm(const struct ud* u) +{ + return u->asm_buf; +} + +/* ============================================================================= + * ud_insn_offset() - Returns the offset. + * ============================================================================= + */ +uint64_t +ud_insn_off(const struct ud* u) +{ + return u->insn_offset; +} + + +/* ============================================================================= + * ud_insn_hex() - Returns hex form of disassembled instruction. + * ============================================================================= + */ +const char* +ud_insn_hex(struct ud* u) +{ + u->insn_hexcode[0] = 0; + if (!u->error) { + unsigned int i; + unsigned char *src_ptr = inp_sess(u); + char* src_hex; + src_hex = (char*) u->insn_hexcode; + /* for each byte used to decode instruction */ + for (i = 0; i < u->inp_ctr && i < sizeof(u->insn_hexcode) / 2; + ++i, ++src_ptr) { + sprintf(src_hex, "%02x", *src_ptr & 0xFF); + src_hex += 2; + } + } + return u->insn_hexcode; +} + + +/* ============================================================================= + * ud_insn_ptr() - Returns code disassembled. + * ============================================================================= + */ +extern const uint8_t* +ud_insn_ptr(const struct ud* u) +{ + return u->inp_sess; +} + +/* ============================================================================= + * ud_insn_len() - Returns the count of bytes disassembled. + * ============================================================================= + */ +extern unsigned int +ud_insn_len(const struct ud* u) +{ + return u->inp_ctr; +} + + +/* ============================================================================= + * ud_insn_get_opr + * Return the operand struct representing the nth operand of + * the currently disassembled instruction. Returns NULL if + * there's no such operand. + * ============================================================================= + */ +const struct ud_operand* +ud_insn_opr(const struct ud *u, unsigned int n) +{ + if (n > 2 || u->operand[n].type == UD_NONE) { + return NULL; + } else { + return &u->operand[n]; + } +} + + +/* ============================================================================= + * ud_opr_is_sreg + * Returns non-zero if the given operand is of a segment register type. + * ============================================================================= + */ +int +ud_opr_is_sreg(const struct ud_operand *opr) +{ + return opr->type == UD_OP_REG && + opr->base >= UD_R_ES && + opr->base <= UD_R_GS; +} + + +/* ============================================================================= + * ud_opr_is_sreg + * Returns non-zero if the given operand is of a general purpose + * register type. + * ============================================================================= + */ +int +ud_opr_is_gpr(const struct ud_operand *opr) +{ + return opr->type == UD_OP_REG && + opr->base >= UD_R_AL && + opr->base <= UD_R_R15; +} + + +/* ============================================================================= + * ud_set_user_opaque_data + * ud_get_user_opaque_data + * Get/set user opaqute data pointer + * ============================================================================= + */ +void +ud_set_user_opaque_data(struct ud * u, void* opaque) +{ + u->user_opaque_data = opaque; +} + +void* +ud_get_user_opaque_data(const struct ud *u) +{ + return u->user_opaque_data; +} + + +/* ============================================================================= + * ud_set_asm_buffer + * Allow the user to set an assembler output buffer. If `buf` is NULL, + * we switch back to the internal buffer. + * ============================================================================= + */ +void +ud_set_asm_buffer(struct ud *u, char *buf, size_t size) +{ + assert(u != NULL); + if (buf == NULL) { + ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); + } else { + u->asm_buf = buf; + u->asm_buf_size = size; + } +} + + +/* ============================================================================= + * ud_set_sym_resolver + * Set symbol resolver for relative targets used in the translation + * phase. + * + * The resolver is a function that takes a uint64_t address and returns a + * symbolic name for the that address. The function also takes a second + * argument pointing to an integer that the client can optionally set to a + * non-zero value for offsetted targets. (symbol+offset) The function may + * also return NULL, in which case the translator only prints the target + * address. + * + * The function pointer maybe NULL which resets symbol resolution. + * ============================================================================= + */ +void +ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, + uint64_t addr, + int64_t *offset)) +{ + u->sym_resolver = resolver; +} + +/* +vim:set ts=2 sw=2 expandtab +*/ diff --git a/Fox/Private/mach_override/mach_override.c b/Fox/Private/mach_override/mach_override.c new file mode 100755 index 0000000..0f0a30d --- /dev/null +++ b/Fox/Private/mach_override/mach_override.c @@ -0,0 +1,705 @@ +// mach_override.c semver:1.2.0 +// Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com +// Some rights reserved: http://opensource.org/licenses/mit +// https://github.com/rentzsch/mach_override + +#include "mach_override.h" +#if defined(__i386__) || defined(__x86_64__) +#include "udis86.h" +#endif + +#include +#include +#include +#include +#include +#include + +#if TARGET_OS_IPHONE +#include +#else +#include +#endif + +/************************** +* +* Constants +* +**************************/ +#pragma mark - +#pragma mark (Constants) + +#if defined(__ppc__) || defined(__POWERPC__) + +long kIslandTemplate[] = { + 0x9001FFFC, // stw r0,-4(SP) + 0x3C00DEAD, // lis r0,0xDEAD + 0x6000BEEF, // ori r0,r0,0xBEEF + 0x7C0903A6, // mtctr r0 + 0x8001FFFC, // lwz r0,-4(SP) + 0x60000000, // nop ; optionally replaced + 0x4E800420 // bctr +}; + +#define kAddressHi 3 +#define kAddressLo 5 +#define kInstructionHi 10 +#define kInstructionLo 11 + +#elif defined(__i386__) + +#define kOriginalInstructionsSize 16 + +char kIslandTemplate[] = { + // kOriginalInstructionsSize nop instructions so that we + // should have enough space to host original instructions + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + // Now the real jump instruction + 0xE9, 0xEF, 0xBE, 0xAD, 0xDE +}; + +#define kInstructions 0 +#define kJumpAddress kInstructions + kOriginalInstructionsSize + 1 +#elif defined(__x86_64__) + +#define kOriginalInstructionsSize 32 + +#define kJumpAddress kOriginalInstructionsSize + 6 + +char kIslandTemplate[] = { + // kOriginalInstructionsSize nop instructions so that we + // should have enough space to host original instructions + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + // Now the real jump instruction + 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +#endif + +#define kAllocateHigh 1 +#define kAllocateNormal 0 + +/************************** +* +* Data Types +* +**************************/ +#pragma mark - +#pragma mark (Data Types) + +typedef struct { + char instructions[sizeof(kIslandTemplate)]; + int allocatedHigh; +} BranchIsland; + +/************************** +* +* Funky Protos +* +**************************/ +#pragma mark - +#pragma mark (Funky Protos) + + mach_error_t +allocateBranchIsland( + BranchIsland **island, + int allocateHigh, + void *originalFunctionAddress); + + mach_error_t +freeBranchIsland( + BranchIsland *island ); + +#if defined(__ppc__) || defined(__POWERPC__) + mach_error_t +setBranchIslandTarget( + BranchIsland *island, + const void *branchTo, + long instruction ); +#endif + +#if defined(__i386__) || defined(__x86_64__) +mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ); +void +atomic_mov64( + uint64_t *targetAddress, + uint64_t value ); + + static Boolean +eatKnownInstructions( + unsigned char *code, + uint64_t *newInstruction, + int *howManyEaten, + char *originalInstructions, + int *originalInstructionCount, + uint8_t *originalInstructionSizes ); + + static void +fixupInstructions( + void *originalFunction, + void *escapeIsland, + void *instructionsToFix, + int instructionCount, + uint8_t *instructionSizes ); +#endif + +/******************************************************************************* +* +* Interface +* +*******************************************************************************/ +#pragma mark - +#pragma mark (Interface) + +#if defined(__i386__) || defined(__x86_64__) +mach_error_t makeIslandExecutable(void *address) { + mach_error_t err = err_none; + uintptr_t page = (uintptr_t)address & ~(uintptr_t)(PAGE_SIZE - 1); + int e = err_none; + e |= mprotect((void *)page, PAGE_SIZE, PROT_EXEC | PROT_READ); + e |= msync((void *)page, PAGE_SIZE, MS_INVALIDATE ); + if (e) { + err = err_cannot_override; + } + return err; +} +#endif + + mach_error_t +mach_override_ptr( + void *originalFunctionAddress, + const void *overrideFunctionAddress, + void **originalFunctionReentryIsland ) +{ + assert( originalFunctionAddress ); + assert( overrideFunctionAddress ); + + // this addresses overriding such functions as AudioOutputUnitStart() + // test with modified DefaultOutputUnit project +#if defined(__x86_64__) + for(;;){ + if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp qword near [rip+0x????????] + originalFunctionAddress=*(void**)((char*)originalFunctionAddress+6+*(int32_t *)((uint16_t*)originalFunctionAddress+1)); + else break; + } +#elif defined(__i386__) + for(;;){ + if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp *0x???????? + originalFunctionAddress=**(void***)((uint16_t*)originalFunctionAddress+1); + else break; + } +#endif + + long *originalFunctionPtr = (long*) originalFunctionAddress; + mach_error_t err = err_none; + +#if defined(__ppc__) || defined(__POWERPC__) + // Ensure first instruction isn't 'mfctr'. + #define kMFCTRMask 0xfc1fffff + #define kMFCTRInstruction 0x7c0903a6 + + long originalInstruction = *originalFunctionPtr; + if( !err && ((originalInstruction & kMFCTRMask) == kMFCTRInstruction) ) + err = err_cannot_override; +#elif defined(__i386__) || defined(__x86_64__) + int eatenCount = 0; + int originalInstructionCount = 0; + char originalInstructions[kOriginalInstructionsSize]; + uint8_t originalInstructionSizes[kOriginalInstructionsSize]; + uint64_t jumpRelativeInstruction = 0; // JMP + + Boolean overridePossible = eatKnownInstructions ((unsigned char *)originalFunctionPtr, + &jumpRelativeInstruction, &eatenCount, + originalInstructions, &originalInstructionCount, + originalInstructionSizes ); + if (eatenCount > kOriginalInstructionsSize) { + //printf ("Too many instructions eaten\n"); + overridePossible = false; + } + if (!overridePossible) err = err_cannot_override; + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); +#endif + + // Make the original function implementation writable. + if( !err ) { + err = vm_protect( mach_task_self(), + (vm_address_t) originalFunctionPtr, 8, false, + (VM_PROT_ALL | VM_PROT_COPY) ); + if( err ) + err = vm_protect( mach_task_self(), + (vm_address_t) originalFunctionPtr, 8, false, + (VM_PROT_DEFAULT | VM_PROT_COPY) ); + } + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + // Allocate and target the escape island to the overriding function. + BranchIsland *escapeIsland = NULL; + if( !err ) + err = allocateBranchIsland( &escapeIsland, kAllocateHigh, originalFunctionAddress ); + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + +#if defined(__ppc__) || defined(__POWERPC__) + if( !err ) + err = setBranchIslandTarget( escapeIsland, overrideFunctionAddress, 0 ); + + // Build the branch absolute instruction to the escape island. + long branchAbsoluteInstruction = 0; // Set to 0 just to silence warning. + if( !err ) { + long escapeIslandAddress = ((long) escapeIsland) & 0x3FFFFFF; + branchAbsoluteInstruction = 0x48000002 | escapeIslandAddress; + } +#elif defined(__i386__) || defined(__x86_64__) + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + if( !err ) + err = setBranchIslandTarget_i386( escapeIsland, overrideFunctionAddress, 0 ); + + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + // Build the jump relative instruction to the escape island +#endif + + +#if defined(__i386__) || defined(__x86_64__) + if (!err) { + uint32_t addressOffset = (uint32_t)((char*)escapeIsland - (char*)originalFunctionPtr - 5); + addressOffset = OSSwapInt32(addressOffset); + + jumpRelativeInstruction |= 0xE900000000000000LL; + jumpRelativeInstruction |= ((uint64_t)addressOffset & 0xffffffff) << 24; + jumpRelativeInstruction = OSSwapInt64(jumpRelativeInstruction); + } +#endif + + // Optionally allocate & return the reentry island. This may contain relocated + // jmp instructions and so has all the same addressing reachability requirements + // the escape island has to the original function, except the escape island is + // technically our original function. + BranchIsland *reentryIsland = NULL; + if( !err && originalFunctionReentryIsland ) { + err = allocateBranchIsland( &reentryIsland, kAllocateHigh, escapeIsland); + if( !err ) + *originalFunctionReentryIsland = reentryIsland; + } + +#if defined(__ppc__) || defined(__POWERPC__) + // Atomically: + // o If the reentry island was allocated: + // o Insert the original instruction into the reentry island. + // o Target the reentry island at the 2nd instruction of the + // original function. + // o Replace the original instruction with the branch absolute. + if( !err ) { + int escapeIslandEngaged = false; + do { + if( reentryIsland ) + err = setBranchIslandTarget( reentryIsland, + (void*) (originalFunctionPtr+1), originalInstruction ); + if( !err ) { + escapeIslandEngaged = CompareAndSwap( originalInstruction, + branchAbsoluteInstruction, + (UInt32*)originalFunctionPtr ); + if( !escapeIslandEngaged ) { + // Someone replaced the instruction out from under us, + // re-read the instruction, make sure it's still not + // 'mfctr' and try again. + originalInstruction = *originalFunctionPtr; + if( (originalInstruction & kMFCTRMask) == kMFCTRInstruction) + err = err_cannot_override; + } + } + } while( !err && !escapeIslandEngaged ); + } +#elif defined(__i386__) || defined(__x86_64__) + // Atomically: + // o If the reentry island was allocated: + // o Insert the original instructions into the reentry island. + // o Target the reentry island at the first non-replaced + // instruction of the original function. + // o Replace the original first instructions with the jump relative. + // + // Note that on i386, we do not support someone else changing the code under our feet + if ( !err ) { + fixupInstructions(originalFunctionPtr, reentryIsland, originalInstructions, + originalInstructionCount, originalInstructionSizes ); + + if( reentryIsland ) + err = setBranchIslandTarget_i386( reentryIsland, + (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); + // try making islands executable before planting the jmp +#if defined(__x86_64__) || defined(__i386__) + if( !err ) + err = makeIslandExecutable(escapeIsland); + if( !err && reentryIsland ) + err = makeIslandExecutable(reentryIsland); +#endif + if ( !err ) + atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction); + mach_error_t prot_err = err_none; + prot_err = vm_protect( mach_task_self(), + (vm_address_t) originalFunctionPtr, 8, false, + (VM_PROT_READ | VM_PROT_EXECUTE) ); + if(prot_err) fprintf(stderr, "err = %x %s:%d\n", prot_err, __FILE__, __LINE__); + } +#endif + + // Clean up on error. + if( err ) { + if( reentryIsland ) + freeBranchIsland( reentryIsland ); + if( escapeIsland ) + freeBranchIsland( escapeIsland ); + } + + return err; +} + +/******************************************************************************* +* +* Implementation +* +*******************************************************************************/ +#pragma mark - +#pragma mark (Implementation) + +/******************************************************************************* + Implementation: Allocates memory for a branch island. + + @param island <- The allocated island. + @param allocateHigh -> Whether to allocate the island at the end of the + address space (for use with the branch absolute + instruction). + @result <- mach_error_t + + ***************************************************************************/ + + mach_error_t +allocateBranchIsland( + BranchIsland **island, + int allocateHigh, + void *originalFunctionAddress) +{ + assert( island ); + + mach_error_t err = err_none; + + if( allocateHigh ) { + assert( sizeof( BranchIsland ) <= PAGE_SIZE ); + vm_address_t page = 0; +#if defined(__i386__) + err = vm_allocate( mach_task_self(), &page, PAGE_SIZE, VM_FLAGS_ANYWHERE ); + if( err == err_none ) + *island = (BranchIsland*) page; +#else + +#if defined(__ppc__) || defined(__POWERPC__) + vm_address_t first = 0xfeffffff; + vm_address_t last = 0xfe000000 + PAGE_SIZE; +#elif defined(__x86_64__) + // 64-bit ASLR is in bits 13-28 + vm_address_t first = ((uint64_t)originalFunctionAddress & ~( (0xFUL << 28) | (PAGE_SIZE - 1) ) ) | (0x1UL << 31); + vm_address_t last = (uint64_t)originalFunctionAddress & ~((0x1UL << 32) - 1); +#endif + + page = first; + int allocated = 0; + vm_map_t task_self = mach_task_self(); + + while( !err && !allocated && page != last ) { + + err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); + if( err == err_none ) + allocated = 1; + else if( err == KERN_NO_SPACE ) { +#if defined(__x86_64__) + page -= PAGE_SIZE; +#else + page += PAGE_SIZE; +#endif + err = err_none; + } + } + if( allocated ) + *island = (BranchIsland*) page; + else if( !allocated && !err ) + err = KERN_NO_SPACE; +#endif + } else { + void *block = malloc( sizeof( BranchIsland ) ); + if( block ) + *island = block; + else + err = KERN_NO_SPACE; + } + if( !err ) + (**island).allocatedHigh = allocateHigh; + + return err; +} + +/******************************************************************************* + Implementation: Deallocates memory for a branch island. + + @param island -> The island to deallocate. + @result <- mach_error_t + + ***************************************************************************/ + + mach_error_t +freeBranchIsland( + BranchIsland *island ) +{ + assert( island ); + assert( (*(long*)&island->instructions[0]) == kIslandTemplate[0] ); + assert( island->allocatedHigh ); + + mach_error_t err = err_none; + + if( island->allocatedHigh ) { + assert( sizeof( BranchIsland ) <= PAGE_SIZE ); + err = vm_deallocate(mach_task_self(), (vm_address_t) island, PAGE_SIZE ); + } else { + free( island ); + } + + return err; +} + +/******************************************************************************* + Implementation: Sets the branch island's target, with an optional + instruction. + + @param island -> The branch island to insert target into. + @param branchTo -> The address of the target. + @param instruction -> Optional instruction to execute prior to branch. Set + to zero for nop. + @result <- mach_error_t + + ***************************************************************************/ +#if defined(__ppc__) || defined(__POWERPC__) + mach_error_t +setBranchIslandTarget( + BranchIsland *island, + const void *branchTo, + long instruction ) +{ + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // Fill in the address. + ((short*)island->instructions)[kAddressLo] = ((long) branchTo) & 0x0000FFFF; + ((short*)island->instructions)[kAddressHi] + = (((long) branchTo) >> 16) & 0x0000FFFF; + + // Fill in the (optional) instuction. + if( instruction != 0 ) { + ((short*)island->instructions)[kInstructionLo] + = instruction & 0x0000FFFF; + ((short*)island->instructions)[kInstructionHi] + = (instruction >> 16) & 0x0000FFFF; + } + + //MakeDataExecutable( island->instructions, sizeof( kIslandTemplate ) ); + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + + return err_none; +} +#endif + +#if defined(__i386__) + mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ) +{ + + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // copy original instructions + if (instructions) { + bcopy (instructions, island->instructions + kInstructions, kOriginalInstructionsSize); + } + + // Fill in the address. + int32_t addressOffset = (char *)branchTo - (island->instructions + kJumpAddress + 4); + *((int32_t *)(island->instructions + kJumpAddress)) = addressOffset; + + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + return err_none; +} + +#elif defined(__x86_64__) +mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ) +{ + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // Copy original instructions. + if (instructions) { + bcopy (instructions, island->instructions, kOriginalInstructionsSize); + } + + // Fill in the address. + *((uint64_t *)(island->instructions + kJumpAddress)) = (uint64_t)branchTo; + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + + return err_none; +} +#endif + + +#if defined(__i386__) || defined(__x86_64__) + static Boolean +eatKnownInstructions( + unsigned char *code, + uint64_t *newInstruction, + int *howManyEaten, + char *originalInstructions, + int *originalInstructionCount, + uint8_t *originalInstructionSizes ) +{ + Boolean allInstructionsKnown = true; + int totalEaten = 0; + int remainsToEat = 5; // a JMP instruction takes 5 bytes + int instructionIndex = 0; + ud_t ud_obj; + + if (howManyEaten) *howManyEaten = 0; + if (originalInstructionCount) *originalInstructionCount = 0; + ud_init(&ud_obj); +#if defined(__i386__) + ud_set_mode(&ud_obj, 32); +#else + ud_set_mode(&ud_obj, 64); +#endif + ud_set_input_buffer(&ud_obj, code, 64); // Assume that 'code' points to at least 64bytes of data. + while (remainsToEat > 0) { + if (!ud_disassemble(&ud_obj)) { + allInstructionsKnown = false; + fprintf(stderr, "mach_override: some instructions unknown! Need to update libudis86\n"); + break; + } + + // At this point, we've matched curInstr + int eaten = ud_insn_len(&ud_obj); + remainsToEat -= eaten; + totalEaten += eaten; + + if (originalInstructionSizes) originalInstructionSizes[instructionIndex] = eaten; + instructionIndex += 1; + if (originalInstructionCount) *originalInstructionCount = instructionIndex; + } + + + if (howManyEaten) *howManyEaten = totalEaten; + + if (originalInstructions) { + Boolean enoughSpaceForOriginalInstructions = (totalEaten < kOriginalInstructionsSize); + + if (enoughSpaceForOriginalInstructions) { + memset(originalInstructions, 0x90 /* NOP */, kOriginalInstructionsSize); // fill instructions with NOP + bcopy(code, originalInstructions, totalEaten); + } else { + // printf ("Not enough space in island to store original instructions. Adapt the island definition and kOriginalInstructionsSize\n"); + return false; + } + } + + if (allInstructionsKnown) { + // save last 3 bytes of first 64bits of codre we'll replace + uint64_t currentFirst64BitsOfCode = *((uint64_t *)code); + currentFirst64BitsOfCode = OSSwapInt64(currentFirst64BitsOfCode); // back to memory representation + currentFirst64BitsOfCode &= 0x0000000000FFFFFFLL; + + // keep only last 3 instructions bytes, first 5 will be replaced by JMP instr + *newInstruction &= 0xFFFFFFFFFF000000LL; // clear last 3 bytes + *newInstruction |= (currentFirst64BitsOfCode & 0x0000000000FFFFFFLL); // set last 3 bytes + } + + return allInstructionsKnown; +} + + static void +fixupInstructions( + void *originalFunction, + void *escapeIsland, + void *instructionsToFix, + int instructionCount, + uint8_t *instructionSizes ) +{ + int index; + for (index = 0;index < instructionCount;index += 1) + { + if (*(uint8_t*)instructionsToFix == 0xE9) // 32-bit jump relative + { + uint32_t offset = (uint32_t)((uintptr_t)originalFunction - (uintptr_t)escapeIsland); + uint32_t *jumpOffsetPtr = (uint32_t*)((uintptr_t)instructionsToFix + 1); + *jumpOffsetPtr += offset; + } + + originalFunction = (void*)((uintptr_t)originalFunction + instructionSizes[index]); + escapeIsland = (void*)((uintptr_t)escapeIsland + instructionSizes[index]); + instructionsToFix = (void*)((uintptr_t)instructionsToFix + instructionSizes[index]); + } +} + +#if defined(__i386__) +__asm( + ".text;" + ".align 2, 0x90;" + "_atomic_mov64:;" + " pushl %ebp;" + " movl %esp, %ebp;" + " pushl %esi;" + " pushl %ebx;" + " pushl %ecx;" + " pushl %eax;" + " pushl %edx;" + + // atomic push of value to an address + // we use cmpxchg8b, which compares content of an address with + // edx:eax. If they are equal, it atomically puts 64bit value + // ecx:ebx in address. + // We thus put contents of address in edx:eax to force ecx:ebx + // in address + " mov 8(%ebp), %esi;" // esi contains target address + " mov 12(%ebp), %ebx;" + " mov 16(%ebp), %ecx;" // ecx:ebx now contains value to put in target address + " mov (%esi), %eax;" + " mov 4(%esi), %edx;" // edx:eax now contains value currently contained in target address + " lock; cmpxchg8b (%esi);" // atomic move. + + // restore registers + " popl %edx;" + " popl %eax;" + " popl %ecx;" + " popl %ebx;" + " popl %esi;" + " popl %ebp;" + " ret" +); +#elif defined(__x86_64__) +void atomic_mov64( + uint64_t *targetAddress, + uint64_t value ) +{ + *targetAddress = value; +} +#endif +#endif diff --git a/Fox/Private/mach_override/mach_override.h b/Fox/Private/mach_override/mach_override.h new file mode 100755 index 0000000..ecd319c --- /dev/null +++ b/Fox/Private/mach_override/mach_override.h @@ -0,0 +1,76 @@ +// mach_override.h semver:1.2.0 +// Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com +// Some rights reserved: http://opensource.org/licenses/mit +// https://github.com/rentzsch/mach_override + +#ifndef _mach_override_ +#define _mach_override_ + +#include +#include + +#define err_cannot_override (err_local|1) + +__BEGIN_DECLS + +/**************************************************************************************** + Dynamically overrides the function implementation referenced by + originalFunctionAddress with the implentation pointed to by overrideFunctionAddress. + Optionally returns a pointer to a "reentry island" which, if jumped to, will resume + the original implementation. + + @param originalFunctionAddress -> Required address of the function to + override (with overrideFunctionAddress). + @param overrideFunctionAddress -> Required address to the overriding + function. + @param originalFunctionReentryIsland <- Optional pointer to pointer to the + reentry island. Can be NULL. + @result <- err_cannot_override if the original + function's implementation begins with + the 'mfctr' instruction. + + ************************************************************************************/ + + mach_error_t +mach_override_ptr( + void *originalFunctionAddress, + const void *overrideFunctionAddress, + void **originalFunctionReentryIsland ); + +__END_DECLS + +/**************************************************************************************** + If you're using C++ this macro will ease the tedium of typedef'ing, naming, keeping + track of reentry islands and defining your override code. See test_mach_override.cp + for example usage. + + ************************************************************************************/ + +#ifdef __cplusplus +#define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR ) \ +{ \ + static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS; \ + static bool ORIGINAL_FUNCTION_NAME##_overriden = false; \ + class mach_override_class__##ORIGINAL_FUNCTION_NAME { \ + public: \ + static kern_return_t override(void *originalFunctionPtr) { \ + kern_return_t result = err_none; \ + if (!ORIGINAL_FUNCTION_NAME##_overriden) { \ + ORIGINAL_FUNCTION_NAME##_overriden = true; \ + result = mach_override_ptr( (void*)originalFunctionPtr, \ + (void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement, \ + (void**)&ORIGINAL_FUNCTION_NAME##_reenter ); \ + } \ + return result; \ + } \ + static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS { + +#define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME ) \ + } \ + }; \ + \ + err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME); \ +} +#endif + +#endif // _mach_override_ diff --git a/Fox/Private/mach_override/udis86.h b/Fox/Private/mach_override/udis86.h new file mode 100755 index 0000000..bdd3857 --- /dev/null +++ b/Fox/Private/mach_override/udis86.h @@ -0,0 +1,33 @@ +/* udis86 - udis86.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UDIS86_H +#define UDIS86_H + +#include "libudis86/types.h" +#include "libudis86/extern.h" +#include "libudis86/itab.h" + +#endif diff --git a/Fox/Public/Data/FOXCommand.m b/Fox/Public/Data/FOXCommand.m index f8f35f7..2a591d4 100644 --- a/Fox/Public/Data/FOXCommand.m +++ b/Fox/Public/Data/FOXCommand.m @@ -20,6 +20,16 @@ - (instancetype)initWithTransition:(id)transition generatedV return self; } +- (BOOL)isEqual:(id)object +{ + if (![object isKindOfClass:[self class]]) { + return NO; + } + FOXCommand *other = object; + return ((self.transition == other.transition || [self.transition isEqual:other.transition]) + && (self.generatedValue == other.generatedValue || [self.generatedValue isEqual:other.generatedValue])); +} + - (NSString *)description { return [self.transition descriptionWithGeneratedValue:self.generatedValue]; diff --git a/Fox/Public/Data/FOXExecutedCommand.h b/Fox/Public/Data/FOXExecutedCommand.h index 2aa5e42..fbba648 100644 --- a/Fox/Public/Data/FOXExecutedCommand.h +++ b/Fox/Public/Data/FOXExecutedCommand.h @@ -1,9 +1,13 @@ #import "FOXCommand.h" + +/*! Represents a command that has executed in a state machine. + * It stores all the data about the execution by the state machine. + */ @interface FOXExecutedCommand : NSObject @property (nonatomic) FOXCommand *command; -@property (nonatomic) NSDate *dateExecuted; +@property (nonatomic) NSTimeInterval timeExecuted; @property (nonatomic) BOOL satisfiesPrecondition; @property (nonatomic) BOOL satisfiesPostcondition; @property (nonatomic) id objectReturnedBySubject; diff --git a/Fox/Public/Data/FOXExecutedCommand.m b/Fox/Public/Data/FOXExecutedCommand.m index ff496a5..35a0b41 100644 --- a/Fox/Public/Data/FOXExecutedCommand.m +++ b/Fox/Public/Data/FOXExecutedCommand.m @@ -7,22 +7,38 @@ - (BOOL)wasSuccessfullyExecuted return self.satisfiesPrecondition && self.satisfiesPostcondition; } +- (BOOL)isEqual:(id)object +{ + if (![object isKindOfClass:[self class]]){ + return NO; + } + + FOXExecutedCommand *other = object; + return ((self.command == other.command || [self.command isEqual:other.command]) + && self.satisfiesPostcondition == other.satisfiesPostcondition + && self.satisfiesPrecondition == other.satisfiesPrecondition + && (self.objectReturnedBySubject == other.objectReturnedBySubject + || [self.objectReturnedBySubject isEqual:other.objectReturnedBySubject]) + && (self.raisedException == other.raisedException + || [self.raisedException isEqual:other.raisedException])); +} + - (NSString *)description { if ([self wasSuccessfullyExecuted]) { return [NSString stringWithFormat:@"[subject %@] -> %@", - self.command, - self.objectReturnedBySubject]; + self.command, + self.objectReturnedBySubject]; } else { return [NSString stringWithFormat:@"[subject %@] -> %@%@%@%@\n Model before: %@\n Model after: %@", - self.command, - self.objectReturnedBySubject, - self.satisfiesPrecondition ? @"" : @" (Precondition FAILED)", - self.satisfiesPostcondition ? @"" : @" (Postcondition FAILED)", - self.raisedException ? [NSString stringWithFormat:@"\n Exception Raised: %@", - self.raisedException] : @"", - self.modelStateBeforeExecution, - self.modelStateAfterExecution]; + self.command, + self.objectReturnedBySubject, + self.satisfiesPrecondition ? @"" : @" (Precondition FAILED)", + self.satisfiesPostcondition ? @"" : @" (Postcondition FAILED)", + self.raisedException ? [NSString stringWithFormat:@"\n Exception Raised: %@", + self.raisedException] : @"", + self.modelStateBeforeExecution, + self.modelStateAfterExecution]; } } diff --git a/Fox/Public/Data/FOXExecutedProgram.h b/Fox/Public/Data/FOXExecutedProgram.h new file mode 100644 index 0000000..14e6251 --- /dev/null +++ b/Fox/Public/Data/FOXExecutedProgram.h @@ -0,0 +1,32 @@ +#import + +@class FOXProgram; + +/*! A data structure that represents the result of executing a given + * program. + * + * FOXProgram is the definition of a program. FOXExecutedProgram is + * the results of executing it. + */ +@interface FOXExecutedProgram : NSObject + +/// The program that was executed. +@property (nonatomic) FOXProgram *program; + +/// An array of FOXExecutedCommands containing the result of +/// executing serialCommands specified in the program property. +/// +/// May be smaller than the defined array of commands if it fails. +@property (nonatomic) NSArray *serialCommands; + +/// A 2D array of FOXExecutedCommands containing the result of +/// executing parallelCommands specified in the program property. +/// +/// May be smaller than the defined array of commands if it fails. +@property (nonatomic) NSArray *parallelCommands; + +/// A bool indicating if the execution of the program conformed +/// to the original program's definition and state machine. +@property (nonatomic) BOOL succeeded; + +@end diff --git a/Fox/Public/Data/FOXExecutedProgram.m b/Fox/Public/Data/FOXExecutedProgram.m new file mode 100644 index 0000000..2c5889c --- /dev/null +++ b/Fox/Public/Data/FOXExecutedProgram.m @@ -0,0 +1,19 @@ +#import "FOXExecutedProgram.h" +#import "FOXDictionary.h" +#import "FOXPrettyArray.h" + +@implementation FOXExecutedProgram + +- (NSString *)description +{ + FOXPrettyArray *serial = [FOXPrettyArray arrayWithArray:self.serialCommands]; + FOXPrettyArray *parallel = [FOXPrettyArray arrayWithArray:self.parallelCommands]; + NSString *succeededString = (self.succeeded ? @"PASSED" : @"FAILED"); + FOXDictionary *result = [FOXDictionary dictionaryWithDictionary:@{@"serial": serial, + @"parallel": parallel}]; + return [NSString stringWithFormat:@"", + succeededString, + result]; +} + +@end diff --git a/Fox/Public/Data/FOXProgram.h b/Fox/Public/Data/FOXProgram.h new file mode 100644 index 0000000..cc0a487 --- /dev/null +++ b/Fox/Public/Data/FOXProgram.h @@ -0,0 +1,23 @@ +#import + +@protocol FOXRandom; +@protocol FOXStateMachine; + +/*! A data structure that represents a potential program to execute. + * The program should always execute serialCommands before parallelCommands. + * + * FOXExecutedProgram is the execution of a given FOXProgram. + */ +@interface FOXProgram : NSObject + +/// An array of FOXCommands to execute. +@property (nonatomic) NSArray *serialCommands; + +/// An 2D-array of FOXCommands that represents each thread +/// of commands to execute. +@property (nonatomic) NSArray *parallelCommands; + +/// The state machine used to generate commands. +@property (nonatomic) id stateMachine; + +@end diff --git a/Fox/Public/Data/FOXProgram.m b/Fox/Public/Data/FOXProgram.m new file mode 100644 index 0000000..47867c7 --- /dev/null +++ b/Fox/Public/Data/FOXProgram.m @@ -0,0 +1,16 @@ +#import "FOXProgram.h" +#import "FOXPrettyArray.h" +#import "FOXDictionary.h" + +@implementation FOXProgram + +- (NSString *)description +{ + FOXPrettyArray *serial = [FOXPrettyArray arrayWithArray:self.serialCommands]; + FOXPrettyArray *parallel = [FOXPrettyArray arrayWithArray:self.parallelCommands]; + FOXDictionary *result = [FOXDictionary dictionaryWithDictionary:@{@"serial": serial, + @"parallel": parallel}]; + return [NSString stringWithFormat:@"", result]; +} + +@end diff --git a/Fox/Public/Data/FOXRoseTree.h b/Fox/Public/Data/FOXRoseTree.h index 35ed53f..b461551 100644 --- a/Fox/Public/Data/FOXRoseTree.h +++ b/Fox/Public/Data/FOXRoseTree.h @@ -8,9 +8,12 @@ /*! A rose tree data structure. Generators return these lazy trees which allows "shrinking" of * a given value by walking its children. * + * The Fox's shrinking algorithm is a greedy, depth-first search. So the smallest possible values + * should be first, as immediate children. + * * Like sequences, rose trees support operations to derive new lazy rose trees from existing ones. */ -@interface FOXRoseTree : NSObject +@interface FOXRoseTree : NSObject /*! The value that this tree holds. Smaller variants of this value are in this tree's children. */ @@ -20,6 +23,7 @@ */ @property (nonatomic) id children; // of FOXRoseTrees + /*! Generates a lazy sequence of rose tree permutations. A permutation is where one of the given * rose trees is replaced by one of its children. * @@ -65,6 +69,20 @@ + (instancetype)treeFromArray:(NSArray *)roseTreeLiteral; /*! Flattens a two-dimensional rose tree into a one-dimensional rose tree. + * + * Appends inner trees' children to the end of the children list: + * + * // data structure: tree(root, children) + * // before joining + * tree(tree(1, [tree(2, [])]), + * [tree(3, [])]) + * // after joining + * tree(1, + * [tree(3, []), + * tree(2, [])]) + * + * Which can create undesireable and local-minimal shrinking results if not + * used carefully. */ + (instancetype)joinedTreeFromNestedRoseTree:(FOXRoseTree *)roseTree; diff --git a/Fox/Public/Data/FOXRoseTree.m b/Fox/Public/Data/FOXRoseTree.m index 76beb4b..24cb4d3 100644 --- a/Fox/Public/Data/FOXRoseTree.m +++ b/Fox/Public/Data/FOXRoseTree.m @@ -1,5 +1,11 @@ #import "FOXRoseTree.h" #import "FOXSequence.h" +#import "FOXPrettyArray.h" +#import "FOXStringUtil.h" +#import "FOXObjectiveCRepresentation.h" + +@interface FOXRoseTree () +@end @implementation FOXRoseTree @@ -21,8 +27,12 @@ + (instancetype)treeFromArray:(NSArray *)roseTreeLiteral for (id subtree in roseTreeLiteral[1]) { [subtrees addObject:[self treeFromArray:subtree]]; } - return [[FOXRoseTree alloc] initWithValue:[roseTreeLiteral firstObject] - children:[FOXSequence sequenceFromArray:subtrees]]; + id value = [roseTreeLiteral firstObject]; + if ([value isEqual:[NSNull null]]) { + value = nil; + } + return [[[self class] alloc] initWithValue:value + children:[FOXSequence sequenceFromArray:subtrees]]; } + (instancetype)joinedTreeFromNestedRoseTree:(FOXRoseTree *)roseTree @@ -32,8 +42,8 @@ + (instancetype)joinedTreeFromNestedRoseTree:(FOXRoseTree *)roseTree return [self joinedTreeFromNestedRoseTree:tree]; }]; id mergedChildren = [childrenChildren sequenceByAppending:firstTree.children]; - return [[FOXRoseTree alloc] initWithValue:firstTree.value - children:mergedChildren]; + return [[[self class] alloc] initWithValue:firstTree.value + children:mergedChildren]; } + (id)sequenceByExpandingRoseTrees:(NSArray *)roseTrees @@ -53,14 +63,15 @@ + (instancetype)joinedTreeFromNestedRoseTree:(FOXRoseTree *)roseTree + (instancetype)shrinkTreeFromRoseTrees:(NSArray *)roseTrees { if (!roseTrees.count) { - return [[FOXRoseTree alloc] initWithValue:@[]]; + return [[[self class] alloc] initWithValue:@[]]; } id children = [[self sequenceByExpandingRoseTrees:roseTrees] sequenceByMapping:^id(id trees) { return [self shrinkTreeFromRoseTrees:[[trees objectEnumerator] allObjects]]; }]; - return [[FOXRoseTree alloc] initWithValue:[roseTrees valueForKey:@"value"] + FOXPrettyArray *values = [FOXPrettyArray arrayWithArray:[roseTrees valueForKey:@"value"]]; + return [[[self class] alloc] initWithValue:values children:children]; } @@ -70,7 +81,8 @@ + (instancetype)zipTreeFromRoseTrees:(NSArray *)roseTrees return [self zipTreeFromRoseTrees:subtrees]; }]; - return [[FOXRoseTree alloc] initWithValue:[roseTrees valueForKey:@"value"] + FOXPrettyArray *values = [FOXPrettyArray arrayWithArray:[roseTrees valueForKey:@"value"]]; + return [[FOXRoseTree alloc] initWithValue:values children:children]; } @@ -89,22 +101,57 @@ - (instancetype)initWithValue:(id)value children:(id)children return self; } -- (FOXRoseTree *)treeByApplyingBlock:(id(^)(id element))block +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder { - return [[FOXRoseTree alloc] initWithValue:block(self.value) - children:[self.children sequenceByMapping:^id(FOXRoseTree *subtree) { + self = [super init]; + if (self) { + _value = [aDecoder decodeObjectForKey:@"value"]; + _children = [aDecoder decodeObjectForKey:@"children"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.value forKey:@"value"]; + [aCoder encodeObject:self.children forKey:@"children"]; +} + +#pragma mark - Protected + +- (void)freeInternals +{ + _value = nil; + _children = nil; +} + +#pragma mark - Public + +- (instancetype)treeByApplyingBlock:(id(^)(id element))block +{ + return [[[self class] alloc] initWithValue:block(self.value) + children:[self.children sequenceByMapping:^id(FOXRoseTree *subtree) { return [subtree treeByApplyingBlock:block]; }]]; } -- (FOXRoseTree *)treeFilterChildrenByBlock:(BOOL(^)(id element))block +- (instancetype)treeFilterChildrenByBlock:(BOOL(^)(id element))block +{ + return [[[self class] alloc] initWithValue:self.value + children:[[self.children sequenceByFiltering:^BOOL(FOXRoseTree *subtree) { + return block(subtree.value); + }] sequenceByMapping:^id(FOXRoseTree *subtree) { + return [subtree treeFilterChildrenByBlock:block]; + }]]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { - return [[FOXRoseTree alloc] initWithValue:self.value - children:[[self.children sequenceByFiltering:^BOOL(FOXRoseTree *subtree) { - return block(subtree.value); - }] sequenceByMapping:^id(FOXRoseTree *subtree) { - return [subtree treeFilterChildrenByBlock:block]; - }]]; + return self; } #pragma mark - NSObject @@ -126,23 +173,38 @@ - (NSUInteger)hash return 31 * [self.value hash] + 31 * [self.children hash]; } +- (NSString *)objectiveCStringRepresentation +{ + NSMutableString *string = [NSMutableString stringWithFormat:@"[%@ treeFromArray:@[", + NSStringFromClass([self class])]; + NSString *valueDesc = FOXRepr(self.value); + if ([self.value isKindOfClass:[NSArray class]]) { + valueDesc = [valueDesc stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + } + [string appendString:FOXIndentString(valueDesc, 2)]; + [string appendString:@",\n"]; + + [string appendString:FOXRepr(self.children)]; + + [string appendString:@"]"]; + return string; +} + - (NSString *)description { - NSMutableString *string = [NSMutableString stringWithFormat:@"<%@: %p\n value=", - NSStringFromClass([self class]), - self]; + NSMutableString *string = [NSMutableString stringWithFormat:@"<("]; NSString *valueDesc = self.value ? [self.value description] : @"nil"; - - NSString *(^indent)(NSString *) = ^NSString *(NSString *s) { - return [s stringByReplacingOccurrencesOfString:@"\n" withString:@"\n "]; - }; - [string appendString:indent(indent(valueDesc))]; + if ([self.value isKindOfClass:[NSArray class]]) { + valueDesc = [valueDesc stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + } + [string appendString:FOXIndentString(valueDesc, 2)]; + [string appendString:@")"]; if ([self.children firstObject]) { - [string appendString:@",\n children={\n"]; + [string appendString:@" {\n"]; for (FOXRoseTree *tree in self.children) { [string appendString:@" "]; - [string appendString:indent(indent([tree description]))]; + [string appendString:FOXIndentString([tree description], 2)]; [string appendString:@"\n"]; } [string appendString:@"}"]; @@ -154,7 +216,9 @@ - (NSString *)description #pragma mark - Private -+ (id)_permutationsOfRoseTrees:(NSArray *)roseTrees currentIndex:(NSUInteger)index remainingChildren:(id)children ++ (id)_permutationsOfRoseTrees:(NSArray *)roseTrees + currentIndex:(NSUInteger)index + remainingChildren:(id)children { return [FOXSequence lazySequenceFromBlock:^id { if ([children firstObject]) { diff --git a/Fox/Public/Data/FOXRunnerResult.h b/Fox/Public/Data/FOXRunnerResult.h index 3a3acac..225f1c9 100644 --- a/Fox/Public/Data/FOXRunnerResult.h +++ b/Fox/Public/Data/FOXRunnerResult.h @@ -8,7 +8,6 @@ @property (nonatomic) NSUInteger numberOfTests; @property (nonatomic) NSUInteger seed; - // properties below are only filled when failures occur (succeeded = NO) @property (nonatomic) NSUInteger failingSize; @property (nonatomic) id failingValue; diff --git a/Fox/Public/Data/FOXRunnerResult.m b/Fox/Public/Data/FOXRunnerResult.m index 11e5e4b..3b1f4c4 100644 --- a/Fox/Public/Data/FOXRunnerResult.m +++ b/Fox/Public/Data/FOXRunnerResult.m @@ -1,4 +1,5 @@ #import "FOXRunnerResult.h" +#import "FOXStringUtil.h" @implementation FOXRunnerResult @@ -36,11 +37,11 @@ - (NSString *)friendlyDescription [string appendFormat:@"\n size that failed: %lu", (unsigned long)self.failingSize]; [string appendFormat:@"\n shrink depth: %lu", (unsigned long)self.shrinkDepth]; [string appendFormat:@"\n shrink nodes walked: %lu", (unsigned long)self.shrinkNodeWalkCount]; - [string appendFormat:@"\n value that failed: %@", self.failingValue]; + [string appendFormat:@"\n value that failed: %@", FOXTrim(FOXDescription(self.failingValue, 1))]; if (self.failingException) { [string appendFormat:@"\n -> raised %@", self.failingException]; } - [string appendFormat:@"\n smallest failing value: %@", self.smallestFailingValue]; + [string appendFormat:@"\n smallest failing value: %@", FOXTrim(FOXDescription(self.smallestFailingValue, 1))]; if (self.failingException) { [string appendFormat:@"\n -> raised %@", self.smallestFailingException]; } diff --git a/Fox/Public/Data/FOXSequence.h b/Fox/Public/Data/FOXSequence.h index 6152df3..177b779 100644 --- a/Fox/Public/Data/FOXSequence.h +++ b/Fox/Public/Data/FOXSequence.h @@ -2,7 +2,7 @@ @protocol FOXSequence; -@protocol FOXSequence +@protocol FOXSequence - (id)firstObject; - (id)remainingSequence; @@ -15,6 +15,7 @@ - (id)sequenceByFiltering:(BOOL (^)(id item))predicate; - (id)sequenceByAppending:(id)sequence; - (id)sequenceByDroppingIndex:(NSUInteger)index; +- (id)sequenceByMapcatting:(id(^)(id item))block; - (id)objectByReducingWithSeed:(id)seedObject reducer:(id(^)(id accum, id item))reducer; @@ -30,12 +31,21 @@ * * Whenever possible, this abstract class will produce lazy sequences when conforming to * the FOXSequence protocol. + * + * @warning - If your sequence implementation is significantly different internally, you should + * also override NSCoding methods. + * + * Subclasses are assumed to be immutable. For example, the NSCopying implementation, + * simply returns self. */ @interface FOXSequence : NSObject { NSUInteger _count; } - (id)firstObject; + +// object returned should be retained by sequence or objc foreach will +// crash. - (id)remainingSequence; @end @@ -58,7 +68,10 @@ */ @interface FOXSequence (LazyConstructors) -+ (instancetype)lazySequenceFromBlock:(id(^)())block; -+ (instancetype)lazyUniqueSequence:(id)sequence; ++ (id)lazySequenceFromBlock:(id(^)())block; ++ (id)lazyUniqueSequence:(id)sequence; ++ (id)lazyRangeStartingAt:(NSInteger)startIndex endingBefore:(NSUInteger)endIndex; ++ (id)subsetsOfSequence:(id)sequence; ++ (id)combinationsOfSequence:(id)sequence size:(NSUInteger)size; @end diff --git a/Fox/Public/Data/FOXSequence.m b/Fox/Public/Data/FOXSequence.m index 9b86703..b550825 100644 --- a/Fox/Public/Data/FOXSequence.m +++ b/Fox/Public/Data/FOXSequence.m @@ -1,8 +1,14 @@ #import "FOXSequence.h" +#import "FOXSequenceEnumerator.h" +#import "FOXMath.h" #import "FOXLazySequence.h" #import "FOXConcreteSequence.h" -#import "FOXSequenceEnumerator.h" +#import "FOXArraySequence.h" +#import "FOXRepeatedSequence.h" +#import "FOXObjectiveCRepresentation.h" +@interface FOXSequence () +@end @implementation FOXSequence @@ -16,6 +22,21 @@ - (id)init return self; } +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + id firstObject = [aDecoder decodeObjectForKey:@"firstObject"]; + id remainingSequence = [aDecoder decodeObjectForKey:@"remainingSequence"]; + return [FOXSequence sequenceWithObject:firstObject remainingSequence:remainingSequence]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.firstObject forKey:@"firstObject"]; + [aCoder encodeObject:self.remainingSequence forKey:@"remainingSequence"]; +} + #pragma mark - FOXSequence - (NSUInteger)count @@ -44,7 +65,7 @@ - (NSEnumerator *)objectEnumerator - (id)sequenceByMappingWithIndex:(id(^)(NSUInteger index, id item))block startingIndex:(NSUInteger)index { - return [[FOXLazySequence alloc] initWithLazyBlock:^id{ + return [[self class] lazySequenceFromBlock:^id{ if (![self firstObject]) { return [[self class] sequence]; } @@ -58,7 +79,7 @@ - (NSEnumerator *)objectEnumerator - (id)sequenceByMapping:(id(^)(id item))block { - return [[FOXLazySequence alloc] initWithLazyBlock:^id{ + return [[self class] lazySequenceFromBlock:^id{ if (![self firstObject]) { return [FOXSequence sequence]; } @@ -71,7 +92,7 @@ - (NSEnumerator *)objectEnumerator - (id)sequenceByFiltering:(BOOL (^)(id item))predicate { - return [[FOXLazySequence alloc] initWithLazyBlock:^id{ + return [[self class] lazySequenceFromBlock:^id{ if (![self firstObject]) { return [[self class] sequence]; } @@ -88,7 +109,7 @@ - (NSEnumerator *)objectEnumerator - (id)sequenceByAppending:(id)sequence { - return [[FOXLazySequence alloc] initWithLazyBlock:^id{ + return [[self class] lazySequenceFromBlock:^id{ if ([self firstObject]) { id remainingSequence = [[self remainingSequence] sequenceByAppending:sequence]; if (!remainingSequence) { @@ -104,7 +125,7 @@ - (NSEnumerator *)objectEnumerator - (id)sequenceByDroppingIndex:(NSUInteger)index { - return [FOXSequence lazySequenceFromBlock:^id { + return [[self class] lazySequenceFromBlock:^id { if (index == 0) { return [self remainingSequence]; } else { @@ -114,6 +135,13 @@ - (NSEnumerator *)objectEnumerator }]; } +- (id)sequenceByMapcatting:(id(^)(id item))block +{ + return [[self sequenceByMapping:block] objectByReducingWithSeed:[FOXSequence sequence] reducer:^id(id accum, id subsequence) { + return [accum sequenceByAppending:subsequence]; + }]; +} + - (id)objectByReducingWithSeed:(id)seedObject reducer:(id(^)(id accum, id item))reducer { @@ -205,6 +233,35 @@ - (NSString *)description return description; } +- (id)valueForKey:(NSString *)key +{ + return [self sequenceByMapping:^id(id item) { + return [item valueForKey:key]; + }]; +} + +- (id)valueForKeyPath:(NSString *)keyPath +{ + return [self sequenceByMapping:^id(id item) { + return [item valueForKeyPath:keyPath]; + }]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + return self; +} + +#pragma mark - FOXObjectiveCRepresentation + +- (NSString *)objectiveCStringRepresentation +{ + return [NSString stringWithFormat:@"[FOXSequence sequenceFromArray:%@]", + FOXRepr([[self objectEnumerator] allObjects])]; +} + #pragma mark - Abstract FOXSequence - (id)remainingSequence @@ -225,11 +282,18 @@ - (id)firstObject @end + + @implementation FOXSequence (EagerConstructors) + (instancetype)sequence { - return [[FOXConcreteSequence alloc] init]; + static FOXSequence *emptySequence; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + emptySequence = [[FOXConcreteSequence alloc] init]; + }); + return emptySequence; } + (instancetype)sequenceWithObject:(id)firstObject @@ -244,20 +308,12 @@ + (instancetype)sequenceWithObject:(id)firstObject remainingSequence:(id seq = nil; - for (id item in [array reverseObjectEnumerator]) { - seq = [[FOXConcreteSequence alloc] initWithObject:item remainingSequence:seq]; - } - return seq ?: [[FOXConcreteSequence alloc] init]; + return [[FOXArraySequence alloc] initWithArray:array]; } + (instancetype)sequenceByRepeatingObject:(id)object times:(NSUInteger)times { - NSMutableArray *array = [NSMutableArray arrayWithCapacity:times]; - for (NSUInteger i = 0; i(^)())block ++ (id)lazySequenceFromBlock:(id(^)())block { return [[FOXLazySequence alloc] initWithLazyBlock:block]; } -+ (instancetype)lazyUniqueSequence:(id)sequence ++ (id)lazyUniqueSequence:(id)sequence { NSMutableSet *set = [NSMutableSet set]; return [sequence sequenceByFiltering:^BOOL(id item) { @@ -283,4 +339,62 @@ + (instancetype)lazyUniqueSequence:(id)sequence }]; } ++ (id)lazyRangeStartingAt:(NSInteger)startIndex endingBefore:(NSUInteger)endIndex +{ + if (startIndex == endIndex) { + return nil; + } + NSInteger incrementAmount = (startIndex > endIndex) ? -1 : 1; + return [self lazySequenceFromBlock:^id{ + return [self sequenceWithObject:@(startIndex) + remainingSequence:[self lazyRangeStartingAt:startIndex + incrementAmount + endingBefore:endIndex]]; + }]; +} + ++ (id)subsetsOfSequence:(id)sequence +{ + id s = [self lazyRangeStartingAt:0 endingBefore:[sequence count] + 1]; + return [s sequenceByMapcatting:^id(id item) { + return [self combinationsOfSequence:sequence size:[item integerValue]]; + }]; +} + ++ (id)combinationsOfSequence:(id)sequence size:(NSUInteger)size +{ + if (size == 0) { + return [self sequenceWithObject:[self sequence]]; + } + if ([sequence count] < size) { + return [self sequence]; + } + if ([sequence count] == size) { + return [self sequenceWithObject:sequence]; + } + NSArray *seqValues = [[sequence objectEnumerator] allObjects]; + id seqOfIndicies = [self indexCombinationsOfSize:size collectionSize:[sequence count]]; + return [seqOfIndicies sequenceByMapping:^id(NSArray *indicies) { + NSMutableArray *values = [NSMutableArray array]; + for (NSNumber *index in indicies) { + [values addObject:seqValues[index.integerValue]]; + } + return [self sequenceFromArray:values]; + }]; +} + ++ (id)indexCombinationsOfSize:(NSUInteger)size collectionSize:(NSUInteger)collectionSize +{ + NSAssert(size <= collectionSize, @"combinations size (%lu) is greater than collection size (%lu)", + size, collectionSize); + NSMutableArray *result = [NSMutableArray array]; + eachCombination(collectionSize, size, ^(NSUInteger *values, NSUInteger numValues) { + NSMutableArray *combination = [NSMutableArray array]; + for (NSUInteger i = 0; i < numValues; i++) { + [combination addObject:@((NSInteger)values[i])]; + } + [result addObject:[self sequenceFromArray:combination]]; + }); + return [self sequenceFromArray:result]; +} + @end diff --git a/Fox/Public/Data/FOXTransition.h b/Fox/Public/Data/FOXTransition.h index f0ae795..6809841 100644 --- a/Fox/Public/Data/FOXTransition.h +++ b/Fox/Public/Data/FOXTransition.h @@ -9,6 +9,7 @@ @property (nonatomic, copy) BOOL(^postcondition)(id modelState, id previousModelState, id subject, id generatedValue, id returnedObject); @property (nonatomic) id generator; @property (nonatomic, copy) NSString *name; +@property (nonatomic) NSUInteger frequency; + (instancetype)byCallingSelector:(SEL)selector withGenerator:(id)generator diff --git a/Fox/Public/Data/FOXTransition.m b/Fox/Public/Data/FOXTransition.m index 91e86e6..d12d999 100644 --- a/Fox/Public/Data/FOXTransition.m +++ b/Fox/Public/Data/FOXTransition.m @@ -9,12 +9,23 @@ @implementation FOXTransition +static NSCache *cache; + ++ (void)initialize +{ + cache = [[NSCache alloc] init]; +} + + (instancetype)byCallingSelector:(SEL)selector withGenerator:(id)generator nextModelState:(id (^)(id modelState, id generatedValue))nextState { FOXTransition *transition = [[FOXTransition alloc] initWithAction:^id(id subject, id generatedValue) { - NSMethodSignature *signature = [subject methodSignatureForSelector:selector]; + NSMethodSignature *signature = [cache objectForKey:[subject class]]; + if (!signature) { + signature = [subject methodSignatureForSelector:selector]; + [cache setObject:signature forKey:[subject class]]; + } NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; NSArray *arguments = [NSArray arrayWithObject:generatedValue]; @@ -48,6 +59,7 @@ - (instancetype)initWithGenerator:(id)generator self.generator = generator; self.action = action; self.nextState = nextState; + self.frequency = 1; } return self; } @@ -162,14 +174,39 @@ static id FOXBoxReturnFromInvocation(NSInvocation *invocation) NSMethodSignature *signature = invocation.methodSignature; __autoreleasing id returnedObject = nil; +#define IS_TYPE_OR_CONST(returnType, type) (IS_TYPE(returnType, @encode(type)) || IS_TYPE(returnType, @encode(const type))) +#define SET_RETURN(type) \ +type value = 0; \ +[invocation getReturnValue:&value]; \ +returnedObject = @(value); if (signature.methodReturnLength > 0) { const char *returnType = signature.methodReturnType; if (IS_TYPE(returnType, @encode(id)) || IS_TYPE(returnType, "#") || IS_TYPE(returnType, "^")) { [invocation getReturnValue:&returnedObject]; + } else if (IS_TYPE_OR_CONST(returnType, long)) { + SET_RETURN(long); + } else if (IS_TYPE_OR_CONST(returnType, long long)) { + SET_RETURN(long long); + } else if (IS_TYPE_OR_CONST(returnType, short)) { + SET_RETURN(short); + } else if (IS_TYPE_OR_CONST(returnType, char)) { + SET_RETURN(char); + } else if (IS_TYPE_OR_CONST(returnType, unsigned long)) { + SET_RETURN(unsigned long); + } else if (IS_TYPE_OR_CONST(returnType, unsigned long long)) { + SET_RETURN(unsigned long long); + } else if (IS_TYPE_OR_CONST(returnType, unsigned short)) { + SET_RETURN(unsigned short); + } else if (IS_TYPE_OR_CONST(returnType, unsigned char)) { + SET_RETURN(unsigned char); + } else if (IS_TYPE_OR_CONST(returnType, float)) { + SET_RETURN(float); + } else if (IS_TYPE_OR_CONST(returnType, double)) { + SET_RETURN(double); } else { void *buffer = (void *)alloca(signature.methodReturnLength); - [invocation getReturnValue:&buffer]; + [invocation getReturnValue:buffer]; returnedObject = [NSValue value:buffer withObjCType:returnType]; } } diff --git a/Fox/Public/Data/TypedData.swift b/Fox/Public/Data/TypedData.swift new file mode 100644 index 0000000..ab37d5d --- /dev/null +++ b/Fox/Public/Data/TypedData.swift @@ -0,0 +1,103 @@ +import Foundation + +/* Needs tests and generator type rewriting first. +public struct TypedSequence { + var seq: FOXSequenceProtocol + init(_ seq: FOXSequenceProtocol) { + self.seq = seq + } + + public var objcSequence: FOXSequenceProtocol { return seq } + + public var firstObject: T? { return seq.firstObject() as T? } + public var remainingSequence: TypedSequence? { + if let seq = seq.remainingSequence() { + return TypedSequence(seq) + } + return nil + } + public var count: UInt { return seq.count() } + + public func map(fn: (T) -> E) -> TypedSequence { + return TypedSequence(seq.sequenceByMapping { fn($0 as T) }) + } + + public func mapIndex(fn: (UInt, T) -> E) -> TypedSequence { + return TypedSequence(seq.sequenceByMappingWithIndex { fn($0, $1 as T) }) + } + + public func mapIndex(fn: (UInt, T) -> E, startingIndex: UInt) -> TypedSequence { + return TypedSequence(seq.sequenceByMappingWithIndex(({ + fn($0, $1 as T) + }), startingIndex: startingIndex)) + } + + public func filter(fn: (T) -> Bool) -> TypedSequence { + return TypedSequence(seq.sequenceByFiltering { fn($0 as T) }) + } + + public func append(appendedSeq: TypedSequence) -> TypedSequence { + return TypedSequence(seq.sequenceByAppending(appendedSeq.seq)) + } + + public func dropIndex(index: UInt) -> TypedSequence { + return TypedSequence(seq.sequenceByDroppingIndex(index)) + } + + public func mapcat(fn: (T) -> TypedSequence) -> TypedSequence { + return TypedSequence(seq.sequenceByMapcatting { fn($0 as T).seq }) + } + + public func reduce(seed: E, fn: (E, T) -> E) -> E { + return seq.objectByReducingWithSeed(seed, reducer: ({ fn($0 as E, $1 as T) })) as E + } +} + +public func map(seq: TypedSequence, fn: (T) -> E) -> TypedSequence { + return seq.map(fn) +} + +public func filter(seq: TypedSequence, fn: (T) -> Bool) -> TypedSequence { + return seq.filter(fn) +} + +public struct TypedRoseTree { + var tree: FOXRoseTree + + init(_ tree: FOXRoseTree) { + self.tree = tree + } + + public var value: T? { return tree.value as T? } + public var children: TypedSequence> { + return TypedSequence>(tree.children) + } + + public func map(fn: (T) -> E) -> TypedRoseTree { + return TypedRoseTree(tree.treeByApplyingBlock { fn($0 as T) }) + } + + public func filterChildren(fn: (T) -> Bool) -> TypedRoseTree { + return TypedRoseTree(tree.treeFilterChildrenByBlock { fn($0 as T) }) + } +} + +public func map(tree: TypedRoseTree, fn: (T) -> E) -> TypedRoseTree { + return tree.map(fn) +} + + +public struct TypedGenerator { + var generator: FOXGenerator + + init(_ generator: FOXGenerator) { + self.generator = generator + } + + public func lazyTree(random: FOXRandom, maximumSize: UInt) -> TypedRoseTree { + let roseTree = generator.lazyTreeWithRandom(random, maximumSize: maximumSize) + return TypedRoseTree(roseTree) + } +} + +*/ \ No newline at end of file diff --git a/Fox/Public/FOXDebugging.m b/Fox/Public/FOXDebugging.m index eac3e65..d70d2e0 100644 --- a/Fox/Public/FOXDebugging.m +++ b/Fox/Public/FOXDebugging.m @@ -5,6 +5,8 @@ #import "FOXDeterministicRandom.h" #import "FOXEnvironment.h" #import "FOXGenerator.h" +#import "FOXPrettyArray.h" + FOX_EXPORT NSArray *FOXSample(id generator) { return FOXSampleWithCount(generator, 10); @@ -17,7 +19,7 @@ FOXRoseTree *tree = [generator lazyTreeWithRandom:random maximumSize:FOXGetMaximumSize()]; [samples addObject:tree.value ?: [NSNull null]]; } - return samples; + return [FOXPrettyArray arrayWithArray:samples]; } @@ -37,5 +39,5 @@ [stack addObjectsFromArray:[[tree.children objectEnumerator] allObjects]]; } - return samples; + return [FOXPrettyArray arrayWithArray:samples]; } diff --git a/Fox/Public/FOXMacros.h b/Fox/Public/FOXMacros.h index a4e8e90..1c9b6a9 100644 --- a/Fox/Public/FOXMacros.h +++ b/Fox/Public/FOXMacros.h @@ -2,4 +2,18 @@ #define FOX_EXPORT FOUNDATION_EXPORT #define FOX_INLINE NS_INLINE +#define FOX_EXTERN FOUNDATION_EXTERN +// Marks ALPHA APIs. Alpha APIs can change between versions. +#define FOX_ALPHA_API + +// Weakly deprecated. Usually indicated for APIs that might be replaced +// by alpha APIs. Users of Fox should ignore this, since this may not result +// in a deprecation in future versions. +// +// No compiler warning emitted. +#define FOX_WEAK_DEPRECATED(s) + +// Add actual deprecation warning. Scheduled for removal. +// Specify the major version of removal, eg - "Will remove in Fox v3.x.x.". +#define FOX_DEPRECATED(s) DEPRECATED_MSG_ATTRIBUTE(s) diff --git a/Fox/Public/FOXRunner.m b/Fox/Public/FOXRunner.m index cb1686b..1bde9eb 100644 --- a/Fox/Public/FOXRunner.m +++ b/Fox/Public/FOXRunner.m @@ -1,21 +1,37 @@ #import "FOXRunner.h" #import "FOXGenerator.h" -#import "FOXRoseTree.h" +#import "FOXRoseTree+Protected.h" #import "FOXDeterministicRandom.h" #import "FOXSequence.h" -#import "FOXRunnerResult.h" +#import "FOXRunnerResult+Protected.h" #import "FOXStandardReporter.h" -#import "FOXReporter.h" #import "FOXPropertyResult.h" -#import "FOXPropertyGenerators.h" #import "FOXEnvironment.h" -typedef struct _FOXShrinkReport { - NSUInteger depth; - NSUInteger numberOfNodesVisited; - CFTypeRef smallestArgument; - CFTypeRef smallestUncaughtException; -} FOXShrinkReport; +// Uncomment this preprocessor definition to make the reporter keep the rose +// tree. Please note that this will balloon the running memory significantly. +// +// Leave this commented before commiting. +//#define FOX_DEBUG + +#ifdef FOX_DEBUG +#define FOX_IF_NOT_DEBUG(...) +#define FOX_IF_DEBUG(...) __VA_ARGS__ +#else +#define FOX_IF_NOT_DEBUG(...) __VA_ARGS__ +#define FOX_IF_DEBUG(...) +#endif + + +@interface FOXShrinkReport : NSObject +@property (nonatomic) NSUInteger depth; +@property (nonatomic) NSUInteger numberOfNodesVisited; +@property (nonatomic) id smallestArgument; +@property (nonatomic) NSException *smallestUncaughtException; +@end + +@implementation FOXShrinkReport +@end @implementation FOXRunner @@ -63,36 +79,38 @@ - (FOXRunnerResult *)resultForNumberOfTests:(NSUInteger)totalNumberOfTests while (true) { for (NSUInteger size = 0; size < maxSize; size++) { - if (currentTestNumber == totalNumberOfTests) { - return [self successfulReportWithNumberOfTests:totalNumberOfTests - maxSize:maxSize - seed:seed]; - } + @autoreleasepool { + if (currentTestNumber == totalNumberOfTests) { + return [self successfulReportWithNumberOfTests:totalNumberOfTests + maxSize:maxSize + seed:seed]; + } - ++currentTestNumber; + ++currentTestNumber; - FOXRoseTree *tree = [property lazyTreeWithRandom:self.random maximumSize:size]; - FOXPropertyResult *result = tree.value; - NSAssert([result isKindOfClass:[FOXPropertyResult class]], - @"Expected property generator to return FOXPropertyResult, got %@", - NSStringFromClass([result class])); + FOXRoseTree *tree = [property lazyTreeWithRandom:self.random maximumSize:size]; + FOXPropertyResult *result = tree.value; + NSAssert([result isKindOfClass:[FOXPropertyResult class]], + @"Expected property generator to return FOXPropertyResult, got %@", + NSStringFromClass([result class])); - [self.reporter runnerWillVerifyTestNumber:currentTestNumber - withMaximumSize:size]; + [self.reporter runnerWillVerifyTestNumber:currentTestNumber + withMaximumSize:size]; - if ([result hasFailedOrRaisedException]) { - return [self failureReportWithNumberOfTests:currentTestNumber - failureRoseTree:tree - failingSize:size - maxSize:maxSize - seed:seed]; - } else if (result.status == FOXPropertyStatusSkipped) { - [self.reporter runnerDidSkipTestNumber:totalNumberOfTests - propertyResult:result]; - } else { - [self.reporter runnerDidPassTestNumber:totalNumberOfTests - propertyResult:result]; + if ([result hasFailedOrRaisedException]) { + return [self failureReportWithNumberOfTests:currentTestNumber + failureRoseTree:tree + failingSize:size + maxSize:maxSize + seed:seed]; + } else if (result.status == FOXPropertyStatusSkipped) { + [self.reporter runnerDidSkipTestNumber:totalNumberOfTests + propertyResult:result]; + } else { + [self.reporter runnerDidPassTestNumber:totalNumberOfTests + propertyResult:result]; + } } } } @@ -145,8 +163,8 @@ - (FOXRunnerResult *)failureReportWithNumberOfTests:(NSUInteger)numberOfTests [self.reporter runnerWillShrinkFailingTestNumber:numberOfTests failedWithPropertyResult:failureRoseTree.value]; FOXPropertyResult *propertyResult = failureRoseTree.value; - FOXShrinkReport report = [self shrinkReportForRoseTree:failureRoseTree - numberOfTests:numberOfTests]; + FOXShrinkReport *report = [self shrinkReportForRoseTree:failureRoseTree + numberOfTests:numberOfTests]; FOXRunnerResult *result = [[FOXRunnerResult alloc] init]; result.numberOfTests = numberOfTests; result.seed = seed; @@ -156,8 +174,9 @@ - (FOXRunnerResult *)failureReportWithNumberOfTests:(NSUInteger)numberOfTests result.failingException = propertyResult.uncaughtException; result.shrinkDepth = report.depth; result.shrinkNodeWalkCount = report.numberOfNodesVisited; - result.smallestFailingValue = CFBridgingRelease(report.smallestArgument); - result.smallestFailingException = CFBridgingRelease(report.smallestUncaughtException); + result.smallestFailingValue = report.smallestArgument; + result.smallestFailingException = report.smallestUncaughtException; + FOX_IF_DEBUG(result.failingRoseTree = failureRoseTree); [self.reporter runnerDidFailTestNumber:numberOfTests withResult:result]; @@ -166,45 +185,46 @@ - (FOXRunnerResult *)failureReportWithNumberOfTests:(NSUInteger)numberOfTests return result; } -- (FOXShrinkReport)shrinkReportForRoseTree:(FOXRoseTree *)failureRoseTree - numberOfTests:(NSUInteger)numberOfTests +- (FOXShrinkReport *)shrinkReportForRoseTree:(FOXRoseTree *)failureRoseTree + numberOfTests:(NSUInteger)numberOfTests { NSUInteger numberOfNodesVisited = 0; NSUInteger depth = 0; id shrinkChoicesAtDepth = failureRoseTree.children; FOXPropertyResult *currentSmallest = failureRoseTree.value; + FOX_IF_NOT_DEBUG([failureRoseTree freeInternals]); + while ([shrinkChoicesAtDepth firstObject]) { - @autoreleasepool { - FOXRoseTree *firstTree = [shrinkChoicesAtDepth firstObject]; + FOXRoseTree *firstTree = [shrinkChoicesAtDepth firstObject]; - // "try" next smallest permutation - FOXPropertyResult *smallestCandidate = firstTree.value; - if ([smallestCandidate hasFailedOrRaisedException]) { - currentSmallest = smallestCandidate; + // "try" next smallest permutation + FOXPropertyResult *smallestCandidate = firstTree.value; + if ([smallestCandidate hasFailedOrRaisedException]) { + currentSmallest = smallestCandidate; - if ([firstTree.children firstObject]) { - shrinkChoicesAtDepth = firstTree.children; - ++depth; - } else { - shrinkChoicesAtDepth = [shrinkChoicesAtDepth remainingSequence]; - } + if ([firstTree.children firstObject]) { + shrinkChoicesAtDepth = firstTree.children; + ++depth; } else { shrinkChoicesAtDepth = [shrinkChoicesAtDepth remainingSequence]; } - - ++numberOfNodesVisited; - [self.reporter runnerDidShrinkFailingTestNumber:numberOfTests - withPropertyResult:smallestCandidate]; + } else { + shrinkChoicesAtDepth = [shrinkChoicesAtDepth remainingSequence]; } + + ++numberOfNodesVisited; + [self.reporter runnerDidShrinkFailingTestNumber:numberOfTests + withPropertyResult:smallestCandidate]; + FOX_IF_NOT_DEBUG([firstTree freeInternals]); } - return (FOXShrinkReport) { - .depth=depth, - .numberOfNodesVisited=numberOfNodesVisited, - .smallestArgument=CFBridgingRetain(currentSmallest.generatedValue), - .smallestUncaughtException=CFBridgingRetain(currentSmallest.uncaughtException), - }; + FOXShrinkReport *report = [[FOXShrinkReport alloc] init]; + report.depth = depth; + report.numberOfNodesVisited = numberOfNodesVisited; + report.smallestArgument = currentSmallest.generatedValue; + report.smallestUncaughtException = currentSmallest.uncaughtException; + return report; } @end diff --git a/Fox/Public/FOXScheduler.h b/Fox/Public/FOXScheduler.h new file mode 100644 index 0000000..7f009b8 --- /dev/null +++ b/Fox/Public/FOXScheduler.h @@ -0,0 +1,16 @@ +#import "FOXMacros.h" + +@protocol FOXRandom; + +FOX_ALPHA_API +@interface FOXScheduler : NSObject + +- (instancetype)initWithRandom:(id)random; +- (instancetype)initWithRandom:(id)random + replaceSystemFunctions:(BOOL)replaceThreads; +- (void)runAndWait:(void(^)())block; + +@end + +FOX_ALPHA_API +FOX_EXPORT void FOXSchedulerYield(void); diff --git a/Fox/Public/FOXScheduler.m b/Fox/Public/FOXScheduler.m new file mode 100644 index 0000000..5b354b7 --- /dev/null +++ b/Fox/Public/FOXScheduler.m @@ -0,0 +1,61 @@ +#import "FOXScheduler.h" +#import "FOXThread.h" + +@interface FOXScheduler () +@property (nonatomic) id random; +@property (nonatomic) BOOL replaceThreads; +@property (nonatomic, copy) void (^block)(); +@end + +@implementation FOXScheduler + +- (instancetype)init +{ + [self doesNotRecognizeSelector:_cmd]; + return self; +} + +- (instancetype)initWithRandom:(id)random +{ + return [self initWithRandom:random replaceSystemFunctions:YES]; +} + +- (instancetype)initWithRandom:(id)random + replaceSystemFunctions:(BOOL)replaceThreads +{ + self = [super init]; + if (self) { + self.random = random; + self.replaceThreads = replaceThreads; + } + return self; +} + +- (void)runAndWait:(void(^)())block +{ + fthread_init(); + fthread_override(self.replaceThreads); + @try { + NSThread *thread = [[NSThread alloc] initWithTarget:self + selector:@selector(runBlock) + object:nil]; + thread.name = @"-[FOXScheduler runAndWait:] Block Thread"; + self.block = block; + [thread start]; + fthread_run_and_wait(fthread_random, (__bridge void *)(self.random)); + } + @finally { + fthread_override(false); + } +} + +- (void)runBlock +{ + self.block(); +} + +@end + +void FOXSchedulerYield(void) { + fthread_yield(); +} diff --git a/Fox/Public/Fox.h b/Fox/Public/Fox.h index ce1177d..082a755 100644 --- a/Fox/Public/Fox.h +++ b/Fox/Public/Fox.h @@ -12,6 +12,8 @@ #import "FOXExecutedCommand.h" #import "FOXTransition.h" #import "FOXPropertyResult.h" +#import "FOXExecutedProgram.h" +#import "FOXProgram.h" // generators #import "FOXCoreGenerators.h" @@ -24,8 +26,10 @@ #import "FOXStateMachineGenerators.h" #import "FOXGenericGenerators.h" -// stateful testers +// stateful testing tools #import "FOXFiniteStateMachine.h" +#import "FOXParallelGenerators.h" +#import "FOXScheduler.h" // randomizers #import "FOXConstantRandom.h" diff --git a/Fox/Public/Generators/FOXArrayGenerators.m b/Fox/Public/Generators/FOXArrayGenerators.m index d797e09..960aba5 100644 --- a/Fox/Public/Generators/FOXArrayGenerators.m +++ b/Fox/Public/Generators/FOXArrayGenerators.m @@ -34,9 +34,18 @@ FOX_EXPORT id FOXArrayOfSizeRange(id elementGenerator, NSUInteger minimumNumberOfElements, NSUInteger maximumNumberOfElements) { - id sizedArrayGenerator = FOXGenerate(^FOXRoseTree *(id random, NSUInteger size) { - return [FOXArrayOfSize(elementGenerator, size) lazyTreeWithRandom:random maximumSize:size]; + id sizeGenerator = FOXChoose(@(minimumNumberOfElements), + @(maximumNumberOfElements)); + return FOXGenBind(sizeGenerator, ^id(FOXRoseTree *sizeTree) { + id generators = [FOXSequence sequenceByRepeatingObject:elementGenerator + times:[sizeTree.value integerValue]]; + id arrayGenerator = [[FOXArrayGenerator alloc] initWithGenerators:generators]; + return FOXGenBind(arrayGenerator, ^id(FOXRoseTree *generatorTree) { + return FOXGenPure([generatorTree treeFilterChildrenByBlock:^BOOL(NSArray *elements) { + NSUInteger count = [elements count]; + return count >= minimumNumberOfElements && count <= maximumNumberOfElements; + }]); + }); }); - sizedArrayGenerator = FOXWithName(@"ArrayOfSizeRange", sizedArrayGenerator); - return FOXResizeRange(sizedArrayGenerator, minimumNumberOfElements, maximumNumberOfElements); } + diff --git a/Fox/Public/Generators/FOXCoreGenerators.h b/Fox/Public/Generators/FOXCoreGenerators.h index 9a70e02..7a246b9 100644 --- a/Fox/Public/Generators/FOXCoreGenerators.h +++ b/Fox/Public/Generators/FOXCoreGenerators.h @@ -5,25 +5,23 @@ @protocol FOXGenerator; @protocol FOXRandom; -typedef struct { - NSInteger start; - NSInteger end; -} FOXRange; - /*! Creates a generator with a -[description] to help debugging. */ FOX_EXPORT id FOXWithName(NSString *name, id generator); /*! Creates a generator that conforms to the FOXGenerator protocol. + * Shrinking is based on the rose tree produced by generator block. */ FOX_EXPORT id FOXGenerate(FOXRoseTree *(^generator)(id random, NSUInteger size)); /*! Creates a generator that always returns the given rose tree. + * Shrinking is based on the rose tree. */ FOX_EXPORT id FOXGenPure(FOXRoseTree *tree); /*! Creates a generator that applies the given block to another generator. - * This effectively "chains" operations on existing generators. + * This effectively "chains" operations on existing generators. Shrinking is + * inherited from the original generator's. * * @param generator The generator whose rose tree is modified post-generation. * @param mapfn The block that transforms the rose tree of the given generator @@ -37,6 +35,8 @@ FOX_EXPORT id FOXGenMap( FOXRoseTree *(^mapfn)(FOXRoseTree *generatedTree)); /*! Creates a generator that takes the rose tree of another generator as input. + * Shrinking behavior is entirely dependent on the rose tree produced by + * the generatorFactory. * * @param generator The generator whose rose tree is used as input. * @param generatorFactory The factory that produces a generator given the @@ -57,7 +57,38 @@ FOX_EXPORT id FOXGenBind( FOX_EXPORT id FOXMap(id generator, id(^fn)(id generatedValue)); /*! Creates a generator that takes another generator's generated values as - * input. This is a higher abstraction than FOXGenBind + * input. This is a higher abstraction than FOXGenBind. Shrinking is based + * on the original generator's shrinking behavior. + * + * @warning Improper use can produce non-optimal shrinking. + * + * Unlike FOXGenBind, FOXBind honors the original generator's shrinking + * behavior. But this can result in non-minimal shrinkings when multiple + * source generators are used to produce a new generator. The resulting + * generator won't guide Fox to fully minimal shrinkings immediately. + * Consider this generator: + * + * id exampleGenerator = \ + * FOXBind(FOXPositiveInteger(), ^id(NSNumber *value1){ + * FOXBind(FOXNegativeInteger(), ^id(NSNumber *value2){ + * return FOXReturn(@[value1, value2]); + * }); + * }); + * + * The resulting shrink tree won't be able to cover all permutations since + * each bind generator cannot infer the relationship between each other. + * The shrinking strategy cannot shrink both values simultaneously. In this + * example, value1 will generally shrink before value2. + * + * // Original value of @[@14, @-9] shrinks to: @[@13, @0] + * FOXAssert(FOXForAll(exampleGenerator), ^BOOL(NSArray *tuple){ + * return [tuple[0] integerValue] + [tuple[1] integerValue] < 10; + * }); + * + * For this specific example, use FOXTuple() instead. FOXTuple and FOXArray + * properly generate all permutations of shrinkings. Both will produce + * values that may be multiple steps as immediate children (eg - an array + * with all values shrunken to zero immediately). * * @param generator The generator whose values will be used as input. * @param fn The factory block that produces a new generator given the other @@ -150,7 +181,8 @@ FOX_EXPORT id FOXOneOf(NSArray *generators); FOX_EXPORT id FOXElements(NSArray *elements); /*! Creates a generator that radomly picks one of the given generators based on - * weighted frequencies. + * weighted frequencies. Shrinking WILL NOT change generators, but only + * shrink on the generated value. * * The percent chance of selecting an element is based on the sum of all the * weights. diff --git a/Fox/Public/Generators/FOXCoreGenerators.m b/Fox/Public/Generators/FOXCoreGenerators.m index 6d4d26f..fa1a516 100644 --- a/Fox/Public/Generators/FOXCoreGenerators.m +++ b/Fox/Public/Generators/FOXCoreGenerators.m @@ -1,6 +1,6 @@ #import "FOXCoreGenerators.h" #import "FOXNamedGenerator.h" -#import "FOXRoseTree.h" +#import "FOXRoseTree+Protected.h" #import "FOXPureGenerator.h" #import "FOXMapGenerator.h" #import "FOXBindGenerator.h" @@ -8,8 +8,7 @@ #import "FOXSizedGenerator.h" #import "FOXSuchThatGenerator.h" #import "FOXBlockGenerator.h" - -#import "FOXSequence.h" +#import "FOXObjectiveCRepresentation.h" FOX_EXPORT id FOXWithName(NSString *name, id generator) { @@ -29,8 +28,7 @@ return [[FOXMapGenerator alloc] initWithGenerator:generator map:mapfn]; } -FOX_EXPORT id FOXGenBind(id generator, - id (^factory)(FOXRoseTree *generatedTree)) { +FOX_EXPORT id FOXGenBind(id generator, id (^factory)(FOXRoseTree *generatedTree)) { return [[FOXBindGenerator alloc] initWithGenerator:generator factory:factory]; } @@ -44,10 +42,6 @@ return [[FOXChooseGenerator alloc] initWithLowerBound:lower upperBound:upper]; } -FOX_EXPORT id FOXChooseRange(FOXRange range) { - return FOXChoose(@(range.start), @(range.end)); -} - FOX_EXPORT id FOXSized(id (^fn)(NSUInteger size)) { return [[FOXSizedGenerator alloc] initWithFactory:fn]; } @@ -66,12 +60,22 @@ FOX_EXPORT id FOXBind(id generator, id (^fn)(id value)) { return FOXGenBind(generator, ^id(FOXRoseTree *generatorTree) { + __block FOXRoseTree *secondaryTree = nil; id innerGenerator = FOXGenerate(^FOXRoseTree *(id random, NSUInteger size) { - return [[generatorTree treeByApplyingBlock:fn] treeByApplyingBlock:^id(id gen) { - return [gen lazyTreeWithRandom:random maximumSize:size]; + return [generatorTree treeByApplyingBlock:^id(id element) { + secondaryTree = [fn(element) lazyTreeWithRandom:random maximumSize:size]; + return secondaryTree; }]; }); return FOXGenMap(innerGenerator, ^FOXRoseTree *(FOXRoseTree *innerTree) { +// NSArray *values = [(FOXRoseTree *)innerTree.value value]; +// if ([values isKindOfClass:[NSArray class]] && ([values[0] integerValue] + [values[1] integerValue]) >= 10) { +// NSLog(@"OriginalTree %@", generatorTree); +// NSLog(@"SecondaryTree %@", secondaryTree); +// NSLog(@"DerivedTree %@", innerTree); +// [NSKeyedArchiver archiveRootObject:innerTree toFile:@"Tree.archive"]; +// NSLog(@"JoinedTree %@", [FOXRoseTree joinedTreeFromNestedRoseTree:innerTree]); +// } return [FOXRoseTree joinedTreeFromNestedRoseTree:innerTree]; }); }); diff --git a/Fox/Public/Generators/FOXFiniteStateMachine.m b/Fox/Public/Generators/FOXFiniteStateMachine.m index 9da6ee5..63149e5 100644 --- a/Fox/Public/Generators/FOXFiniteStateMachine.m +++ b/Fox/Public/Generators/FOXFiniteStateMachine.m @@ -2,7 +2,7 @@ #import "FOXStateTransition.h" #import "FOXCommand.h" #import "FOXExecutedCommand.h" -#import "FOXArray.h" +#import "FOXPrettyArray.h" @interface FOXFiniteStateMachine () @@ -23,6 +23,8 @@ - (instancetype)initWithInitialModelState:(id)initialModelState return self; } +#pragma mark - FOXStateMachine + - (void)addTransition:(id)transition { NSParameterAssert([transition conformsToProtocol:@protocol(FOXStateTransition)]); @@ -34,32 +36,40 @@ - (NSArray *)allTransitions return self.transitions; } -- (BOOL)isValidCommandSequence:(NSArray *)commands +- (id)modelStateFromCommandSequence:(NSArray *)commands +{ + return [self modelStateFromCommandSequence:commands startingModelState:self.initialModelState]; +} + +- (id)modelStateFromCommandSequence:(NSArray *)commands startingModelState:(id)modelState { - id modelState = self.initialModelState; for (FOXCommand *command in commands) { id transition = command.transition; id generatedValue = command.generatedValue; if (![transition satisfiesPreConditionForModelState:modelState]) { - return NO; + return nil; } modelState = [transition nextModelStateFromModelState:modelState generatedValue:generatedValue]; } - return YES; + return modelState; } - (NSArray *)executeCommandSequence:(NSArray *)commands subject:(id)subject +{ + return [self executeCommandSequence:commands subject:subject startingModelState:self.initialModelState]; +} + +- (NSArray *)executeCommandSequence:(NSArray *)commands subject:(id)subject startingModelState:(id)modelState { NSMutableArray *executedCommands = [NSMutableArray array]; - id modelState = self.initialModelState; for (FOXCommand *command in commands) { id transition = command.transition; id generatedValue = command.generatedValue; id previousModalState = modelState; FOXExecutedCommand *executedCommand = [[FOXExecutedCommand alloc] init]; + executedCommand.timeExecuted = CFAbsoluteTimeGetCurrent(); executedCommand.command = command; - executedCommand.dateExecuted = [NSDate date]; executedCommand.modelStateBeforeExecution = modelState; [executedCommands addObject:executedCommand]; @@ -99,8 +109,7 @@ - (NSArray *)executeCommandSequence:(NSArray *)commands subject:(id)subject executedCommand.satisfiesPostcondition = YES; } - FOXArray *prettyExecutedCommands = [[FOXArray alloc] initWithArray:executedCommands]; - return prettyExecutedCommands; + return [FOXPrettyArray arrayWithArray:executedCommands]; } @end diff --git a/Fox/Public/Generators/FOXGenericGenerators.m b/Fox/Public/Generators/FOXGenericGenerators.m index 30a5a1f..dfad496 100644 --- a/Fox/Public/Generators/FOXGenericGenerators.m +++ b/Fox/Public/Generators/FOXGenericGenerators.m @@ -4,7 +4,6 @@ #import "FOXNumericGenerators.h" #import "FOXArrayGenerators.h" #import "FOXSetGenerators.h" -#import "FOXDictionaryGenerators.h" FOX_EXPORT id FOXOptional(id generator) { diff --git a/Fox/Public/Generators/FOXNumericGenerators.h b/Fox/Public/Generators/FOXNumericGenerators.h index a3c4728..5d727df 100644 --- a/Fox/Public/Generators/FOXNumericGenerators.h +++ b/Fox/Public/Generators/FOXNumericGenerators.h @@ -102,7 +102,6 @@ FOX_EXPORT id FOXDouble(void); */ FOX_EXPORT id FOXDecimalNumber(void); - /*! Creates a generator that produces random NSIntegers with an increased * probability of picking INT_MAX and INT_MIN. Shrinks towards 0. * @@ -218,3 +217,12 @@ FOX_EXPORT id FOXFamousDouble(void); * @returns a generator that produces NSDecimalNumbers. */ FOX_EXPORT id FOXFamousDecimalNumber(void); + +/*! Creates a generator that produces random number generators (FOXRandom + * instances). + * + * Shrinking is currently only dicated by the seed of the PRNG. + * + * @returns a generator that produces id instances. + */ +FOX_EXPORT id FOXSeed(void); diff --git a/Fox/Public/Generators/FOXNumericGenerators.m b/Fox/Public/Generators/FOXNumericGenerators.m index a5c86a7..f7287e1 100644 --- a/Fox/Public/Generators/FOXNumericGenerators.m +++ b/Fox/Public/Generators/FOXNumericGenerators.m @@ -1,13 +1,13 @@ #import "FOXNumericGenerators.h" #import "FOXCoreGenerators.h" -#import "FOXGenerator.h" -#import "FOXArrayGenerators.h" #import "FOXRoseTree.h" #import "FOXChooseGenerator.h" #import "FOXLimits.h" #import +#import "FOXDeterministicRandom.h" +#import "FOXSequenceRandom.h" -FOX_EXPORT id _FOXNaturalInteger(void) { +static id _FOXNaturalInteger(void) { return FOXMap(FOXInteger(), ^id(NSNumber *number) { return @(ABS([number integerValue])); }); @@ -153,7 +153,6 @@ return FOXWithName(@"DecimalNumber", gen); } - #pragma mark - Famous Generators FOX_EXPORT id FOXFamousInteger(void) { @@ -223,3 +222,10 @@ @[@1, FOXReturn([NSDecimalNumber maximumDecimalNumber])], @[@1, FOXReturn([NSDecimalNumber notANumber])]])); } + +FOX_EXPORT id FOXSeed(void) { + return FOXBind(FOXPositiveInteger(), ^id(NSNumber *value) { + id random = [[FOXDeterministicRandom alloc] initWithSeed:[value unsignedIntegerValue]]; + return FOXReturn(random); + }); +} diff --git a/Fox/Public/Generators/FOXParallelGenerators.h b/Fox/Public/Generators/FOXParallelGenerators.h new file mode 100644 index 0000000..75b9bc9 --- /dev/null +++ b/Fox/Public/Generators/FOXParallelGenerators.h @@ -0,0 +1,40 @@ +#import "FOXMacros.h" + +@class FOXProgram; +@class FOXExecutedProgram; +@protocol FOXGenerator; +@protocol FOXStateMachine; + +/*! A generator that produces FOXPrograms from the given state machine. The + * program executes two phases: serial and parallel commands. + * + * Serial commands are always executed before running the parallel commands. + * Parallel commands can run in this configuration range (and can change + * at any time): + * + * - 2-3 threads + * - 2-3 commands per thread + * + * Programs shrink in number of commands but may not fully shrink due to the + * non-deterministic nature of parallel execution. + * + * @param stateMachine The state machine to source commands to create. + * @returns a generator that produces a FOXProgram. + */ +FOX_ALPHA_API +FOX_EXPORT id FOXParallelProgram(id stateMachine); + +/*! Executes a given program on multiple threads for the given subject. It then + * checks for linearizability of the subject which is return in executed + * program. + * + * @param program The defined program to execute + * @param subjectFactory A block that creates a fresh instance of the subject + * under test. + * @returns A program that stores the results of running the program. + */ +FOX_ALPHA_API +FOX_EXPORT FOXExecutedProgram *FOXRunParallelProgram(FOXProgram *program, + id (^subjectFactory)()); + +// use FOXReturnOrRaisePrettyProgram() from FOXStateMachine.h diff --git a/Fox/Public/Generators/FOXParallelGenerators.m b/Fox/Public/Generators/FOXParallelGenerators.m new file mode 100644 index 0000000..05454a4 --- /dev/null +++ b/Fox/Public/Generators/FOXParallelGenerators.m @@ -0,0 +1,143 @@ +#import "FOXParallelGenerators.h" +#import "FOXCoreGenerators.h" +#import "FOXStateMachine.h" +#import "FOXStateMachineGenerators.h" +#import "FOXPrettyArray.h" +#import "FOXStateMachineGenerator.h" +#import "FOXArrayGenerators.h" +#import "FOXBlock.h" +#import "FOXMath.h" +#import "FOXExecutedProgram.h" +#import "FOXProgram.h" +#import "FOXRoseTree.h" + +static BOOL FOXExecutedSuccessfullyInParallel(FOXExecutedProgram *parallelExecution, id(^subjectFactory)()); + +FOX_EXPORT id FOXParallelProgram(id stateMachine) { + id prefixGen = [[FOXStateMachineGenerator alloc] initWithStateMachine:stateMachine]; + return FOXBind(prefixGen, ^id(NSArray *prefixCommands) { + // "Private" parameters for parallel test generation. + // + // WARNING: these parameters tweak the problem space of linearizability + // checking which is NP-Complete (roughly O(N!) where N=total + // number of commands). Also, Fox's currently checker is + // the most naive solver - brute-force. + // + // These variables are not exposed as tweakable parameters + // for those reasons. + // + // Current worse case: (2*3)! = 720 possible linearizations. + // So each failing parallel test will spawn 720 more + // serialized tests to run. Remember that every shrink attempt + // counts as a failing test too (although with smaller + // linearization space). + NSNumber *minCommandsPerThread = @1; + NSNumber *maxCommandsPerThread = @2; + const NSUInteger minNumOfThreads = 2; + const NSUInteger maxNumOfThreads = 3; + + id prefixState = [stateMachine modelStateFromCommandSequence:prefixCommands + startingModelState:[stateMachine initialModelState]]; + id process = [[FOXStateMachineGenerator alloc] initWithStateMachine:stateMachine + initialModelState:prefixState + minSize:minCommandsPerThread + maxSize:maxCommandsPerThread]; + id processesGenerator = FOXArrayOfSizeRange(process, minNumOfThreads, maxNumOfThreads); + return FOXMap(processesGenerator, ^id(NSArray *processCommands) { + FOXProgram *program = [[FOXProgram alloc] init]; + program.serialCommands = prefixCommands; + program.parallelCommands = processCommands; + program.stateMachine = stateMachine; + return program; + }); + }); +} + +FOX_EXPORT FOXExecutedProgram *FOXRunParallelProgram(FOXProgram *program, id (^subjectFactory)()) { + @autoreleasepool { + id stateMachine = program.stateMachine; + NSArray *prefixCommands = program.serialCommands; + NSArray *processCommands = program.parallelCommands; + + id subject = subjectFactory(); + id prefixModelState = [stateMachine modelStateFromCommandSequence:prefixCommands + startingModelState:[stateMachine initialModelState]]; + NSArray *executedPrefix = [stateMachine executeCommandSequence:prefixCommands + subject:subject + startingModelState:[stateMachine initialModelState]]; + NSMutableArray *threads = [NSMutableArray array]; + NSMutableArray *blocks = [NSMutableArray array]; + dispatch_group_t group = dispatch_group_create(); + size_t numThreads = 0; + for (NSArray *commands in processCommands) { + dispatch_group_enter(group); + FOXBlock *block = [[FOXBlock alloc] initWithGroup:group block:^id{ + return [stateMachine executeCommandSequence:commands + subject:subject + startingModelState:prefixModelState]; + }]; + [blocks addObject:block]; + + NSThread *thread = [[NSThread alloc] initWithTarget:block + selector:@selector(run) + object:nil]; + thread.name = [NSString stringWithFormat:@"Fox Test Thread %lu", numThreads + 1]; + [threads addObject:thread]; + numThreads++; + } + [threads makeObjectsPerformSelector:@selector(start)]; + dispatch_group_wait(group, DISPATCH_TIME_FOREVER); + [threads removeAllObjects]; + + NSMutableArray *results = [blocks valueForKey:NSStringFromSelector(@selector(result))]; + NSArray *executedCommands = [FOXPrettyArray arrayWithArray:results]; + + FOXExecutedProgram *result = [[FOXExecutedProgram alloc] init]; + result.program = program; + result.serialCommands = executedPrefix; + result.parallelCommands = executedCommands; + result.succeeded = FOXExecutedSuccessfullyInParallel(result, subjectFactory); + return result; + } +} + +// AKA - the linearizability checker +static BOOL FOXExecutedSuccessfullyInParallel(FOXExecutedProgram *program, id(^subjectFactory)()) { + id stateMachine = program.program.stateMachine; + NSArray *executedPrefix = program.serialCommands; + if (!FOXExecutedSuccessfully(executedPrefix)) { + return NO; + } + NSArray *executedProcesses = program.parallelCommands; + NSMutableArray *commands = [NSMutableArray array]; + for (NSArray *clientCmds in executedProcesses) { + [commands addObjectsFromArray:clientCmds]; + } + if ([commands count] == 0) { + return YES; + } + + NSArray *prefix = [executedPrefix valueForKey:@"command"]; + + // There can be lots of permutations which can aggressively expand + // our memory heap. Keeping memory allocations can quickly become + // the bottleneck. + __block BOOL executedSuccessfully = NO; + eachPermutation(commands, ^BOOL(NSArray *permutation) { + @autoreleasepool { + if (executedSuccessfully) { + return NO; + } + id subject = subjectFactory(); + [stateMachine executeCommandSequence:prefix + subject:subject + startingModelState:[stateMachine initialModelState]]; + NSArray *linearizedExecutedCommands = [stateMachine executeCommandSequence:[permutation valueForKey:@"command"] + subject:subject + startingModelState:[stateMachine initialModelState]]; + executedSuccessfully = [linearizedExecutedCommands isEqual:permutation]; + return !executedSuccessfully; + } + }); + return executedSuccessfully; +} diff --git a/Fox/Public/Generators/FOXPropertyGenerators.h b/Fox/Public/Generators/FOXPropertyGenerators.h index 4427288..192ca50 100644 --- a/Fox/Public/Generators/FOXPropertyGenerators.h +++ b/Fox/Public/Generators/FOXPropertyGenerators.h @@ -22,6 +22,17 @@ FOX_EXPORT id FOXForAll(id generator, BOOL (^then)(i */ FOX_EXPORT id FOXForSome(id generator, FOXPropertyStatus (^then)(id generatedValue)); +/*! Creates a generator that retries the given property generator a number of + * times. The failed property is returned if any one of the attempts fails. + * + * This is generally useful for tests that are unreliably failing (eg - + * parallel tests). + * + * @param times The number of times to run the property. + * @param property The property to retry multiple times. + */ +FOX_EXPORT id FOXAlways(NSUInteger times, id property); + #if !defined(FOX_DISABLE_SHORTHAND) /*! Creates a generator that maps an assertion block against input from a * generator. diff --git a/Fox/Public/Generators/FOXPropertyGenerators.m b/Fox/Public/Generators/FOXPropertyGenerators.m index b8b734c..f952de5 100644 --- a/Fox/Public/Generators/FOXPropertyGenerators.m +++ b/Fox/Public/Generators/FOXPropertyGenerators.m @@ -1,5 +1,9 @@ #import "FOXPropertyGenerators.h" #import "FOXCoreGenerators.h" +#import "FOXGenerator.h" +#import "FOXRandom.h" +#import "FOXRoseTree.h" +#import "FOXAssertionException.h" FOX_EXPORT id FOXForAll(id generator, BOOL (^then)(id generatedValue)) { @@ -15,6 +19,9 @@ @try { result.status = verifier(value); } + @catch (FOXAssertionException *exception) { + return exception.result; + } @catch (NSException *exception) { result.uncaughtException = exception; result.status = FOXPropertyStatusUncaughtException; @@ -22,3 +29,23 @@ return result; })); } + +FOX_EXPORT id FOXAlways(NSUInteger times, id property) { + return FOXWithName(@"Always", FOXGenerate(^FOXRoseTree *(id random, NSUInteger size) { + NSUInteger repetition = MAX(times, 1); + NSMutableArray *trees = [NSMutableArray arrayWithCapacity:repetition]; + for (NSUInteger i = 0; i < repetition; i++) { + FOXRoseTree *roseTree = [property lazyTreeWithRandom:[random copy] maximumSize:size]; + [trees addObject:roseTree]; + } + FOXRoseTree *treeArray = [FOXRoseTree zipTreeFromRoseTrees:trees]; + return [treeArray treeByApplyingBlock:^id(NSArray *propertyResults) { + for (FOXPropertyResult *result in propertyResults) { + if ([result hasFailedOrRaisedException]) { + return result; + } + } + return [propertyResults firstObject]; + }]; + })); +} diff --git a/Fox/Public/Generators/FOXStateMachine.h b/Fox/Public/Generators/FOXStateMachine.h index ac4fa56..33902b2 100644 --- a/Fox/Public/Generators/FOXStateMachine.h +++ b/Fox/Public/Generators/FOXStateMachine.h @@ -1,11 +1,22 @@ -#import +#import "FOXMacros.h" -@protocol FOXStateMachine +@protocol FOXStateMachine - (id)initialModelState; - (NSArray *)allTransitions; // FOXStateTransitions -- (BOOL)isValidCommandSequence:(NSArray *)commands; // FOXCommands -- (NSArray *)executeCommandSequence:(NSArray *)commands subject:(id)subject; +- (id)modelStateFromCommandSequence:(NSArray *)commands startingModelState:(id)modelState; +- (NSArray *)executeCommandSequence:(NSArray *)commands subject:(id)subject startingModelState:(id)modelState; + +// Deprecated methods + +@optional +- (id)modelStateFromCommandSequence:(NSArray *)commands +FOX_DEPRECATED("Use -[modelStateFromCommandSequence:startingModelState:] instead. Will remove in Fox v2.x.x."); + +@optional +- (NSArray *)executeCommandSequence:(NSArray *)commands + subject:(id)subject +FOX_DEPRECATED("Use -[executeCommandSequence:subject:startingModelState:] instead. Will remove in Fox v2.x.x."); @end diff --git a/Fox/Public/Generators/FOXStateMachineGenerators.h b/Fox/Public/Generators/FOXStateMachineGenerators.h index 9074cf9..be89b76 100644 --- a/Fox/Public/Generators/FOXStateMachineGenerators.h +++ b/Fox/Public/Generators/FOXStateMachineGenerators.h @@ -3,6 +3,8 @@ @protocol FOXGenerator; @protocol FOXStateMachine; +@class FOXProgram; +@class FOXExecutedProgram; /*! A generator that produces an array of FOXCommands from the given state * machine. The commands conform to the specification that the given @@ -14,7 +16,8 @@ * @param stateMachine The state machine to source commands to create. * @returns a generator that produces arrays of commands to execute. */ -FOX_EXPORT id FOXCommands(id stateMachine); +FOX_EXPORT id FOXCommands(id stateMachine) +FOX_WEAK_DEPRECATED("Use FOXSerialProgram() instead. Will be removed in Fox 2.x.x"); /*! A generator that produce an array of FOXExecutedCommands by executing * against a subject. @@ -27,7 +30,8 @@ FOX_EXPORT id FOXCommands(id stateMachine); * @returns a generator that produces arrays of commands that have been * executed against the subject. */ -FOX_EXPORT id FOXExecuteCommands(id stateMachine, id (^subject)(void)); +FOX_EXPORT id FOXExecuteCommands(id stateMachine, id (^subject)(void)) +FOX_WEAK_DEPRECATED("Use FOXRunSerialProgram() inside the FOXForAll(...) instead. Will be removed in Fox 2.x.x"); /*! A helper function that can be used to check if the given array of executed * commands match the expected behavior of the state machine that was used @@ -37,4 +41,41 @@ FOX_EXPORT id FOXExecuteCommands(id stateMachine, * @returns YES if the executed commands match the original state machine * that produces them. Returns NO otherwise. */ +FOX_ALPHA_API FOX_EXPORT BOOL FOXExecutedSuccessfully(NSArray *executedCommands); + +/*! A generator that produces FOXPrograms from the given state machine. The + * commands conform to the specification that the given state machine + * specifies. + * + * The command shrinks identically to arrays - generated values are shrunk + * with commands that do not provoke the failure dropped from the array. + * + * @param stateMachine The state machine to source commands to create. + * @returns a generator that produces a FOXProgram. + */ +FOX_ALPHA_API +FOX_EXPORT id FOXSerialProgram(id stateMachine); + +/*! A helper function that runs the list of commands against a given subject, + * that conforms to the specified behavior of the state machine. + * + * @param program The program definition to execute. + * @param subject An instance of the subject to test. + * @returns A data structure representing the execution result which contains + * an array of FOXExecutedCommands in the serialCommands property and + * a BOOL indicating if the commands successfully executed. There + * are no commands executed in parallel. + */ +FOX_ALPHA_API +FOX_EXPORT FOXExecutedProgram *FOXRunSerialProgram(FOXProgram *program, id subject); + +/*! A helper function that either returns or raises an control-flow exception to + * provide a FOXForSome/FOXForAll with execution results if the program failed + * to execute according to its state machine. + * + * @param program The program to verify and pretty-print on failure. + * @returns A bool indicating if the program succeeded. + */ +FOX_ALPHA_API +FOX_EXPORT BOOL FOXReturnOrRaisePrettyProgram(FOXExecutedProgram *program); diff --git a/Fox/Public/Generators/FOXStateMachineGenerators.m b/Fox/Public/Generators/FOXStateMachineGenerators.m index 59fc363..8e51709 100644 --- a/Fox/Public/Generators/FOXStateMachineGenerators.m +++ b/Fox/Public/Generators/FOXStateMachineGenerators.m @@ -2,52 +2,38 @@ #import "FOXGenerator.h" #import "FOXCoreGenerators.h" #import "FOXStateMachine.h" -#import "FOXArrayGenerators.h" -#import "FOXStateTransition.h" -#import "FOXRoseTree.h" -#import "FOXCommand.h" #import "FOXExecutedCommand.h" +#import "FOXStateMachineGenerator.h" +#import "FOXExecutedProgram.h" +#import "FOXProgram.h" +#import "FOXPropertyGenerators.h" +#import "FOXRaiseResult.h" -/** - Returns a generator of commands to execute from a given state machine. - */ -FOX_EXPORT id FOXGenCommands(id stateMachine) { - return FOXGenBind(FOXElements([stateMachine allTransitions]), ^id(FOXRoseTree *generatorTree) { - id transition = generatorTree.value; - id argGenerator = nil; - - if ([transition respondsToSelector:@selector(generator)]) { - argGenerator = [transition generator]; - } else { - argGenerator = FOXReturn(@[]); - } - - return FOXMap(FOXTuple(@[FOXReturn(transition), argGenerator]), ^id(NSArray *commandTuple) { - return [[FOXCommand alloc] initWithTransition:commandTuple[0] generatedValue:commandTuple[1]]; - }); +FOX_EXPORT id FOXSerialProgram(id stateMachine) { + id stateMachineGenerator = [[FOXStateMachineGenerator alloc] initWithStateMachine:stateMachine]; + return FOXMap(stateMachineGenerator, ^id(NSArray *commands) { + FOXProgram *program = [[FOXProgram alloc] init]; + program.stateMachine = stateMachine; + program.serialCommands = commands; + return program; }); } - FOX_EXPORT id FOXCommands(id stateMachine) { - return FOXSuchThat(FOXArray(FOXGenCommands(stateMachine)), ^BOOL(NSArray *commands) { - return [stateMachine isValidCommandSequence:commands]; + return FOXMap(FOXSerialProgram(stateMachine), ^id(FOXProgram *program) { + return program.serialCommands; }); } -/** - Returns a generator of executed commands using a given state machine and subject factory. - */ FOX_EXPORT id FOXExecuteCommands(id stateMachine, id (^subject)(void)) { return FOXMap(FOXCommands(stateMachine), ^id(NSArray *commands) { - return [stateMachine executeCommandSequence:commands subject:subject()]; + return [stateMachine executeCommandSequence:commands + subject:subject() + startingModelState:[stateMachine initialModelState]]; }); } -/** - Verifies if a given array of executed commands completed successfully. - */ FOX_EXPORT BOOL FOXExecutedSuccessfully(NSArray *executedCommands) { for (FOXExecutedCommand *cmd in executedCommands) { if (![cmd wasSuccessfullyExecuted]) { @@ -57,3 +43,27 @@ FOX_EXPORT BOOL FOXExecutedSuccessfully(NSArray *executedCommands) { return YES; } + +FOX_EXPORT FOXExecutedProgram *FOXRunSerialProgram(FOXProgram *program, id subject) { + id stateMachine = program.stateMachine; + NSArray *commands = program.serialCommands; + + FOXExecutedProgram *result = [[FOXExecutedProgram alloc] init]; + result.program = program; + result.serialCommands = [stateMachine executeCommandSequence:commands + subject:subject + startingModelState:[stateMachine initialModelState]]; + result.succeeded = FOXExecutedSuccessfully(result.serialCommands); + return result; +} + +FOX_EXPORT BOOL FOXReturnOrRaisePrettyProgram(FOXExecutedProgram *program) { + NSCAssert(program, @"Received argument was nil"); + FOXPropertyResult *result = [[FOXPropertyResult alloc] init]; + result.generatedValue = program; + result.status = FOXRequire(program.succeeded); + if ([result hasFailedOrRaisedException]) { + FOXRaiseResult(result); + } + return YES; +} diff --git a/Fox/Public/Generators/FOXStateTransition.h b/Fox/Public/Generators/FOXStateTransition.h index 82129a6..d613edc 100644 --- a/Fox/Public/Generators/FOXStateTransition.h +++ b/Fox/Public/Generators/FOXStateTransition.h @@ -110,4 +110,13 @@ generatedValue:(id)generatedValue objectReturnedBySubject:(id)returnedObject; +/*! The frequency that this state transition will be attempted to use. + * The default is 1 if this method is not implemented. + * + * The percentage to use is dependent on the total of all frequencies for all + * state transitions. + */ +@optional +- (NSUInteger)frequency; + @end diff --git a/Fox/Public/Generators/FOXStringGenerators.m b/Fox/Public/Generators/FOXStringGenerators.m index a8863d4..84ad7d4 100644 --- a/Fox/Public/Generators/FOXStringGenerators.m +++ b/Fox/Public/Generators/FOXStringGenerators.m @@ -1,6 +1,5 @@ #import "FOXStringGenerators.h" #import "FOXCoreGenerators.h" -#import "FOXGenerator.h" #import "FOXStringGenerator.h" #import "FOXArrayGenerators.h" diff --git a/Fox/Public/Generators/SwiftGenerators.swift b/Fox/Public/Generators/SwiftGenerators.swift index 2f80eb2..1ccf300 100644 --- a/Fox/Public/Generators/SwiftGenerators.swift +++ b/Fox/Public/Generators/SwiftGenerators.swift @@ -151,18 +151,34 @@ public func set(elementGenerator: FOXGenerator) -> FOXGenerator { // MARK: State Machine Generators +public func serialCommands(stateMachine: FOXStateMachine) -> FOXGenerator { + return FOXSerialProgram(stateMachine) +} + +@availability(*, message="Use serialCommands() instead") public func commands(stateMachine: FOXStateMachine) -> FOXGenerator { - return FOXCommands(stateMachine) + return map(FOXSerialProgram(stateMachine)) { obj in + var program = obj as FOXProgram + return program.serialCommands; + } } +@availability(*, message="Use runCommands() instead") public func executeCommands(stateMachine: FOXStateMachine, subjectFactory: () -> AnyObject!) -> FOXGenerator { - return FOXExecuteCommands(stateMachine, subjectFactory) + return FOXMap(commands(stateMachine), { cmds in + var commandsArray : NSArray = cmds as NSArray + return stateMachine.executeCommandSequence(commandsArray, subject: subjectFactory(), startingModelState: stateMachine.initialModelState()) + }) } public func executedSuccessfully(commands: NSArray) -> Bool { return FOXExecutedSuccessfully(commands) } +public func runSerialCommands(program: FOXProgram, subject: AnyObject) -> FOXExecutedProgram { + return FOXRunSerialProgram(program, subject) +} + // MARK: String Generators public func character() -> FOXGenerator { diff --git a/Fox/Public/Random/FOXConstantRandom.m b/Fox/Public/Random/FOXConstantRandom.m index 7f0268b..b8eb23c 100644 --- a/Fox/Public/Random/FOXConstantRandom.m +++ b/Fox/Public/Random/FOXConstantRandom.m @@ -29,4 +29,9 @@ - (long long)randomIntegerWithinMinimum:(long long)minimumNumber andMaximum:(lon return MAX(MIN(self.value, maximumNumber), minimumNumber); } +- (id)copyWithZone:(NSZone *)zone +{ + return [[[self class] allocWithZone:zone] initWithValue:self.value]; +} + @end diff --git a/Fox/Public/Random/FOXDeterministicRandom.mm b/Fox/Public/Random/FOXDeterministicRandom.mm index 2703de3..920d961 100644 --- a/Fox/Public/Random/FOXDeterministicRandom.mm +++ b/Fox/Public/Random/FOXDeterministicRandom.mm @@ -44,4 +44,17 @@ - (long long)randomIntegerWithinMinimum:(long long)minimumNumber andMaximum:(lon return randomNumber + minimumNumber; } +- (id)copyWithZone:(NSZone *)zone +{ + FOXDeterministicRandom *r = [[[self class] allocWithZone:zone] initWithSeed:self.seed]; + r->_generator = _generator; + return r; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p seed=%llu>", + NSStringFromClass([self class]), self, self.seed]; +} + @end diff --git a/Fox/Public/Random/FOXRandom.h b/Fox/Public/Random/FOXRandom.h index 87641d3..05decbb 100644 --- a/Fox/Public/Random/FOXRandom.h +++ b/Fox/Public/Random/FOXRandom.h @@ -7,7 +7,7 @@ * It must also support the concept of "seeds"--that is, a randomness * provider, given the same seed, must produce the same data. */ -@protocol FOXRandom +@protocol FOXRandom /*! Represent the seed of the random number generator. * @@ -27,5 +27,9 @@ - (long long)randomIntegerWithinMinimum:(long long)minimumNumber andMaximum:(long long)maximumNumber; +/*! Copies the PRNG. + */ +- (id)copy; + @end diff --git a/Fox/Public/Reporters/FOXStandardReporter.h b/Fox/Public/Reporters/FOXStandardReporter.h index 14e54a1..6803373 100644 --- a/Fox/Public/Reporters/FOXStandardReporter.h +++ b/Fox/Public/Reporters/FOXStandardReporter.h @@ -1,4 +1,3 @@ -#import "FOXRunner.h" #import "FOXReporter.h" diff --git a/FoxSpecs/Helpers/FOXSpecHelper.h b/FoxSpecs/Helpers/FOXSpecHelper.h index 662c4c0..91ab90f 100644 --- a/FoxSpecs/Helpers/FOXSpecHelper.h +++ b/FoxSpecs/Helpers/FOXSpecHelper.h @@ -3,6 +3,10 @@ @interface FOXSpecHelper : NSObject + (NSUInteger)numberOfTestsPerProperty; ++ (FOXRunnerResult *)resultForProperty:(id)propertyGenerator; ++ (FOXRunnerResult *)debug_resultForProperty:(id)propertyGenerator; ++ (FOXRunnerResult *)resultForProperty:(id)propertyGenerator + numberOfTests:(NSUInteger)numberOfTests; + (FOXRunnerResult *)resultForAll:(id)generator then:(BOOL(^)(id value))block; + (FOXRunnerResult *)resultForAll:(id)generator diff --git a/FoxSpecs/Helpers/FOXSpecHelper.m b/FoxSpecs/Helpers/FOXSpecHelper.m index e01e804..0023516 100644 --- a/FoxSpecs/Helpers/FOXSpecHelper.m +++ b/FoxSpecs/Helpers/FOXSpecHelper.m @@ -14,6 +14,24 @@ + (void)initialize printf("FOX_NUM_TESTS=%lu, FOX_SEED=%lu, FOX_MAX_SIZE=%lu\n", (unsigned long)FOXGetNumberOfTests(), (unsigned long)FOXGetSeed(), (unsigned long)FOXGetMaximumSize()); } ++ (FOXRunnerResult *)resultForProperty:(id)propertyGenerator +{ + FOXRunner *quick = [[FOXRunner alloc] initWithReporter:nil]; + return [quick resultForNumberOfTests:[self numberOfTestsPerProperty] property:propertyGenerator]; +} + ++ (FOXRunnerResult *)debug_resultForProperty:(id)propertyGenerator +{ + FOXRunner *quick = [[FOXRunner alloc] initWithReporter:[[FOXDebugReporter alloc] init]]; + return [quick resultForNumberOfTests:[self numberOfTestsPerProperty] property:propertyGenerator]; +} + ++ (FOXRunnerResult *)resultForProperty:(id)propertyGenerator numberOfTests:(NSUInteger)numberOfTests +{ + FOXRunner *quick = [[FOXRunner alloc] initWithReporter:nil]; + return [quick resultForNumberOfTests:numberOfTests property:propertyGenerator]; +} + + (FOXRunnerResult *)resultForAll:(id)generator then:(BOOL(^)(id value))block { @@ -24,7 +42,6 @@ + (FOXRunnerResult *)resultForAll:(id)generator return [quick resultForNumberOfTests:[self numberOfTestsPerProperty] property:property]; } - + (FOXRunnerResult *)resultForAll:(id)generator then:(BOOL(^)(id value))block numberOfTests:(NSUInteger)numberOfTests diff --git a/FoxSpecs/Helpers/Queue.m b/FoxSpecs/Helpers/Queue.m index cf5f647..6e0b83f 100644 --- a/FoxSpecs/Helpers/Queue.m +++ b/FoxSpecs/Helpers/Queue.m @@ -1,11 +1,9 @@ #import "Queue.h" - @interface Queue () @property (nonatomic) NSMutableArray *items; @end - @implementation Queue - (instancetype)init diff --git a/FoxSpecs/Helpers/Ticker.h b/FoxSpecs/Helpers/Ticker.h new file mode 100644 index 0000000..eda3caf --- /dev/null +++ b/FoxSpecs/Helpers/Ticker.h @@ -0,0 +1,17 @@ +#import + +@interface Ticker : NSObject + +- (NSInteger)increment; +- (void)reset; + +- (NSInteger)atomicIncrement; +- (void)atomicReset; + +- (NSInteger)atomicIncrementWithManualInstrumentation; +- (void)atomicResetWithManualInstrumentation; + +- (NSInteger)incrementWithManualInstrumentation; +- (void)resetWithManualInstrumentation; + +@end diff --git a/FoxSpecs/Helpers/Ticker.m b/FoxSpecs/Helpers/Ticker.m new file mode 100644 index 0000000..89748d0 --- /dev/null +++ b/FoxSpecs/Helpers/Ticker.m @@ -0,0 +1,99 @@ +#import "Ticker.h" +#import + +void fthread_yield(void); + +@interface Ticker () +@property (nonatomic) NSInteger count; +@end + +@implementation Ticker { + OSSpinLock _lock; +} + +- (NSInteger)increment +{ + return ++self.count; +} + +- (void)reset +{ + self.count = 0; +} + +- (NSInteger)incrementWithInstanceVariable +{ + return ++_count; +} + +- (void)resetWithInstanceVariable +{ + _count = 0; +} + +- (NSInteger)incrementMoreComplicatedThanNeeded +{ +#define NEW(A) [[A alloc] init] + NSMutableArray *numbers = NEW(NSMutableArray); + for (NSInteger i = 0; i < self.count; i++) { + [numbers addObject:@(self.count - i)]; + } + [numbers insertObject:@([numbers[0] integerValue] + 1) atIndex:0]; + return [[[[numbers objectEnumerator] allObjects] lastObject] integerValue]; +#undef NEW +} + +- (void)resetMoreComplicatedThanNeeded +{ + [self setCount:[@(10 / 2 - (4 + 1)) integerValue]]; +} + +- (NSInteger)atomicIncrement +{ + OSSpinLockLock(&_lock); + NSInteger result = [self increment]; + OSSpinLockUnlock(&_lock); + return result; +} + +- (void)atomicReset +{ + OSSpinLockLock(&_lock); + [self reset]; + OSSpinLockUnlock(&_lock); +} + +- (NSInteger)atomicIncrementWithManualInstrumentation +{ + OSSpinLockLock(&_lock); + NSInteger result = [self incrementWithManualInstrumentation]; + OSSpinLockUnlock(&_lock); + return result; +} + +- (void)atomicResetWithManualInstrumentation +{ + OSSpinLockLock(&_lock); + [self resetWithManualInstrumentation]; + OSSpinLockUnlock(&_lock); +} + +- (NSInteger)incrementWithManualInstrumentation +{ + fthread_yield(); + NSInteger count = self.count; + fthread_yield(); + count++; + fthread_yield(); + self.count = count; + fthread_yield(); + return count; +} + +- (void)resetWithManualInstrumentation +{ + fthread_yield(); + self.count = 0; +} + +@end diff --git a/FoxSpecs/Public/Data/FOXRoseTreeSpec.mm b/FoxSpecs/Public/Data/FOXRoseTreeSpec.mm index e914dae..188b88b 100644 --- a/FoxSpecs/Public/Data/FOXRoseTreeSpec.mm +++ b/FoxSpecs/Public/Data/FOXRoseTreeSpec.mm @@ -16,14 +16,36 @@ inputTree2 = [[FOXRoseTree alloc] initWithValue:@3 children:[FOXSequence sequenceWithObject:[[FOXRoseTree alloc] initWithValue:@4]]]; }); + describe(@"value object", ^{ + it(@"should be copyable", ^{ + inputTree1 should equal([inputTree1 copy]); + }); + + it(@"should be equal to trees with the same value and children", ^{ + inputTree1 should equal(inputTree1); + inputTree1 should equal([[FOXRoseTree alloc] initWithValue:@1 children:[FOXSequence sequenceWithObject:[[FOXRoseTree alloc] initWithValue:@2]]]); + }); + + it(@"should not equal to trees with different values and children", ^{ + inputTree1 should_not equal(inputTree2); + inputTree1 should_not equal([[FOXRoseTree alloc] initWithValue:@1]); + }); + + it(@"should be encodable", ^{ + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:inputTree1]; + FOXRoseTree *tree = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + tree should equal(inputTree1); + }); + }); + describe(@"permutations", ^{ it(@"should generate permutations by replacing children as given tree, for each tree in the array", ^{ - FOXRoseTree *tree = [FOXRoseTree permutationsOfRoseTrees:@[inputTree1, inputTree2]]; + id trees = [FOXRoseTree permutationsOfRoseTrees:@[inputTree1, inputTree2]]; NSArray *compressedExpectedResult = @[@[@[@2, @[]], @[@3, @[@[@4, @[]]]]], @[@[@1, @[@[@2, @[]]]], @[@4, @[]]]]; - tree should equal([[FOXSequence sequenceFromArray:compressedExpectedResult] sequenceByMapping:^id(NSArray *item) { + trees should equal([[FOXSequence sequenceFromArray:compressedExpectedResult] sequenceByMapping:^id(NSArray *item) { NSMutableArray *subarray = [NSMutableArray array]; for (id subtree in item) { [subarray addObject:[FOXRoseTree treeFromArray:subtree]]; @@ -33,6 +55,26 @@ tree should equal([[FOXSequence sequenceFromArray:compressedExpectedResult] sequ }); }); + describe(@"joining trees", ^{ + it(@"should remove one level of nesting", ^{ +#define TREE(...) [FOXRoseTree treeFromArray:(__VA_ARGS__)] + FOXRoseTree *inputTree = TREE(@[TREE(@[@[@-1, @-3], @[]]), + @[@[TREE(@[@[@-1, @0], @[]]), @[]], + @[TREE(@[@[@-1, @-2], @[]]), + @[@[TREE(@[@[@-1, @0], @[]]), @[]], + @[TREE(@[@[@-1, @-1], @[]]), + @[@[TREE(@[@[@-1, @0], @[]]), @[]]]]]]]]); + FOXRoseTree *joinedTree = [FOXRoseTree joinedTreeFromNestedRoseTree:inputTree]; + joinedTree should equal(TREE(@[@[@-1, @-3], + @[@[@[@-1, @0], @[]], + @[@[@-1, @-2], + @[@[@[@-1, @0], @[]], + @[@[@-1, @-1], @[@[@[@-1, @0], @[]]]]]]]] + )); +#undef TREE + }); + }); + describe(@"zipping rose trees", ^{ it(@"should combine trees without reducing their size", ^{ FOXRoseTree *tree = [FOXRoseTree zipTreeFromRoseTrees:@[inputTree1, inputTree2]]; diff --git a/FoxSpecs/Public/Data/FOXSequenceSpec.mm b/FoxSpecs/Public/Data/FOXSequenceSpec.mm index 79f7bc7..d37b759 100644 --- a/FoxSpecs/Public/Data/FOXSequenceSpec.mm +++ b/FoxSpecs/Public/Data/FOXSequenceSpec.mm @@ -1,6 +1,7 @@ #import #import "FOX.h" #import "NSArray+FastEnumerator.h" +#import using namespace Cedar::Matchers; using namespace Cedar::Doubles; @@ -10,6 +11,43 @@ describe(@"FOXSequence", ^{ __block FOXSequence *subject; + describe(@"as a value object", ^{ + beforeEach(^{ + subject = [FOXSequence sequenceWithObject:@1 remainingSequence:[FOXSequence sequenceFromArray:@[@2, @3]]]; + }); + + it(@"should be copyable", ^{ + subject should equal([subject copy]); + }); + + it(@"should be equal to sequences with the same values", ^{ + [FOXSequence sequence] should equal([FOXSequence sequenceWithObject:nil]); + subject should equal(subject); + subject should equal([FOXSequence sequenceWithObject:@1 remainingSequence:[FOXSequence sequenceFromArray:@[@2, @3]]]); + }); + + it(@"should not equal to sequences with different values", ^{ + subject should_not equal([FOXSequence sequence]); + subject should_not equal([FOXSequence sequenceWithObject:@2 remainingSequence:[FOXSequence sequenceFromArray:@[@2, @3]]]); + }); + + id (^encodeAndDecode)(id) = ^id(id obj) { + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:obj]; + return [NSKeyedUnarchiver unarchiveObjectWithData:data]; + }; + + it(@"should be encodable", ^{ + encodeAndDecode(subject) should equal(subject); + + id arraySequence = [FOXSequence sequenceByRepeatingObject:@1 times:5]; + encodeAndDecode(arraySequence) should equal(arraySequence); + + id rangeSequence = [FOXSequence lazyRangeStartingAt:0 endingBefore:10]; + encodeAndDecode(rangeSequence) should equal(rangeSequence); + }); + }); + + describe(@"concrete sequences", ^{ describe(@"zero-element sequence", ^{ beforeEach(^{ @@ -158,9 +196,10 @@ evaluated = NO; remainingSequence = nice_fake_for(@protocol(FOXSequence)); + __weak id weakRemainingSequence = remainingSequence; subject = [FOXSequence lazySequenceFromBlock:^id { evaluated = YES; - return [FOXSequence sequenceWithObject:@1 remainingSequence:remainingSequence]; + return [FOXSequence sequenceWithObject:@1 remainingSequence:weakRemainingSequence]; }]; remainingSequence stub_method(@selector(count)).and_return((NSUInteger)1); @@ -207,6 +246,30 @@ remainingSequence stub_method(@selector(sequenceByMapping:)) [seq1 sequenceByAppending:seq2] should equal([FOXSequence sequenceFromArray:@[@1, @2]]); }); }); + + describe(@"subset", ^{ + it(@"should generate all subsets of sequences for two elements", ^{ + id s = [FOXSequence sequenceFromArray:@[@1, @2]]; + id expectedSeq = [FOXSequence sequenceFromArray:@[[FOXSequence sequence], + [FOXSequence sequenceFromArray:@[@1]], + [FOXSequence sequenceFromArray:@[@2]], + [FOXSequence sequenceFromArray:@[@1, @2]]]]; + [FOXSequence subsetsOfSequence:s] should equal(expectedSeq); + }); + + it(@"should generate all subsets of sequences", ^{ + id s = [FOXSequence sequenceFromArray:@[@1, @2, @3]]; + id expectedSeq = [FOXSequence sequenceFromArray:@[[FOXSequence sequence], + [FOXSequence sequenceFromArray:@[@1]], + [FOXSequence sequenceFromArray:@[@2]], + [FOXSequence sequenceFromArray:@[@3]], + [FOXSequence sequenceFromArray:@[@1, @2]], + [FOXSequence sequenceFromArray:@[@1, @3]], + [FOXSequence sequenceFromArray:@[@2, @3]], + [FOXSequence sequenceFromArray:@[@1, @2, @3]]]]; + [FOXSequence subsetsOfSequence:s] should equal(expectedSeq); + }); + }); }); }); diff --git a/FoxSpecs/Public/FOXPropertySpec.mm b/FoxSpecs/Public/FOXPropertySpec.mm index 3bcad31..6e0644f 100644 --- a/FoxSpecs/Public/FOXPropertySpec.mm +++ b/FoxSpecs/Public/FOXPropertySpec.mm @@ -1,7 +1,6 @@ #import #import "FOX.h" -#import "FOXRunner.h" -#import "FOXArrayGenerators.h" +#import "FOXSpecHelper.h" using namespace Cedar::Matchers; @@ -105,4 +104,25 @@ }); }); +/* +xdescribe(@"FOXFor", ^{ + it(@"should allow nesting of properties that shrink minimally", ^{ + id property = FOXFor(FOXInteger(), ^id(id a) { + return FOXFor(FOXInteger(), ^id(id b) { + return FOXGenerateProperty(^FOXPropertyStatus{ + return FOXRequire([a integerValue] <= [b integerValue] + || [b integerValue] < 10); + }); + }); + }); + + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_falsy; + NSArray *tuple = result.smallestFailingValue; + NSInteger sum = [tuple[0] integerValue] + [tuple[1] integerValue]; + sum should equal(10); + }); +}); +*/ + SPEC_END diff --git a/FoxSpecs/Public/Generators/FOXAlwaysSpec.mm b/FoxSpecs/Public/Generators/FOXAlwaysSpec.mm new file mode 100644 index 0000000..a92341e --- /dev/null +++ b/FoxSpecs/Public/Generators/FOXAlwaysSpec.mm @@ -0,0 +1,32 @@ +#import +#import "Fox.h" +#import "FOXSpecHelper.h" + +using namespace Cedar::Matchers; +using namespace Cedar::Doubles; + +SPEC_BEGIN(FOXAlwaysSpec) + +describe(@"FOXAlways", ^{ + it(@"should consistently fail flacky behavior", ^{ + FOXRunner *quick = [[FOXRunner alloc] initWithReporter:nil]; + + __block NSUInteger count = 0; + __block id lastSeenValue = nil; + id property = FOXForAll(FOXInteger(), ^BOOL(id value) { + if ([lastSeenValue isEqual:value]) { + ++count; + } + lastSeenValue = value; + if (count == 10) { + count = 0; + return NO; + } + return YES; + }); + FOXRunnerResult *result = [quick resultForNumberOfTests:500 property:FOXAlways(10, property)]; + result.succeeded should be_falsy; + }); +}); + +SPEC_END diff --git a/FoxSpecs/Public/Generators/FOXBindSpec.mm b/FoxSpecs/Public/Generators/FOXBindSpec.mm index 6d59a13..d320b17 100644 --- a/FoxSpecs/Public/Generators/FOXBindSpec.mm +++ b/FoxSpecs/Public/Generators/FOXBindSpec.mm @@ -1,5 +1,6 @@ #import #import "Fox.h" +#import "FOXSpecHelper.h" using namespace Cedar::Matchers; using namespace Cedar::Doubles; @@ -7,6 +8,22 @@ SPEC_BEGIN(FOXBindSpec) describe(@"FOXBind", ^{ + describe(@"Example Test", ^{ + FOXRoseTree *threeShrinkTree = [FOXRoseTree treeFromArray:@[@3, @[@[@0, @[]], + @[@2, @[@[@0, @[]], + @[@1, @[@[@0, @[]]]]]]]]]; + + it(@"should not change the original binded tree", ^{ + id generator = FOXBind(FOXGenPure(threeShrinkTree), ^id(id generatedValue) { + return FOXReturn(generatedValue); + }); + + id random = [[FOXConstantRandom alloc] initWithValue:0]; + FOXRoseTree *tree = [generator lazyTreeWithRandom:random maximumSize:5]; + tree should equal(threeShrinkTree); + }); + }); + it(@"should no-op if the binding block only returns", ^{ id originalGenerator = FOXResize(FOXChoose(@0, @3), 5); id bindedGenerator = FOXBind(originalGenerator, ^id(id generatedValue) { @@ -17,6 +34,36 @@ FOXRoseTree *expectedTree = [originalGenerator lazyTreeWithRandom:random maximumSize:50]; tree should equal(expectedTree); }); + + xit(@"should shrink both values in order, without backtracking", ^{ + id generator = FOXBind(FOXPositiveInteger(), ^id(id value1) { + return FOXBind(FOXPositiveInteger(), ^id(id value2) { + return FOXReturn(@[value1, value2]); + }); + }); + id property = FOXForAll(generator, ^BOOL(id values) { + return [values[0] integerValue] + [values[1] integerValue] < 13; + }); + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_falsy; +// result.smallestFailingValue should equal(@[@0, @10]); + }); + + it(@"should shrink both values, but may not be fully minimal", ^{ + id generator = FOXBind(FOXInteger(), ^id(id value1) { + return FOXBind(FOXInteger(), ^id(id value2) { + return FOXReturn(@[value1, value2]); + }); + }); + id property = FOXForAll(generator, ^BOOL(id values) { + return [values[0] integerValue] + [values[1] integerValue] < 10; + }); + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_falsy; + NSArray *tuple = result.smallestFailingValue; + NSInteger sum = [tuple[0] integerValue] + [tuple[1] integerValue]; + sum should be_greater_than_or_equal_to(10); + }); }); SPEC_END diff --git a/FoxSpecs/Public/Generators/FOXFiniteStateMachineSpec.mm b/FoxSpecs/Public/Generators/FOXFiniteStateMachineSpec.mm index ed3ec85..800ec81 100644 --- a/FoxSpecs/Public/Generators/FOXFiniteStateMachineSpec.mm +++ b/FoxSpecs/Public/Generators/FOXFiniteStateMachineSpec.mm @@ -1,5 +1,5 @@ #import -#import "FOX.h" +#import "Fox.h" #import "QueueRemoveTransition.h" #import "QueueAddTransition.h" #import "FOXSpecHelper.h" @@ -29,11 +29,9 @@ }); it(@"should be able validate queue behavior", ^{ - id executedCommands = FOXExecuteCommands(stateMachine, ^id { - return [Queue new]; - }); - FOXAssert(FOXForAll(executedCommands, ^BOOL(NSArray *commands) { - return FOXExecutedSuccessfully(commands); + FOXAssert(FOXForAll(FOXSerialProgram(stateMachine), ^BOOL(FOXProgram *program) { + Queue *subject = [[Queue alloc] init]; + return FOXRunSerialProgram(program, subject).succeeded; })); }); }); diff --git a/FoxSpecs/Public/Generators/FOXParallelStateMachineSpec.mm b/FoxSpecs/Public/Generators/FOXParallelStateMachineSpec.mm new file mode 100644 index 0000000..2e21afa --- /dev/null +++ b/FoxSpecs/Public/Generators/FOXParallelStateMachineSpec.mm @@ -0,0 +1,178 @@ +#import +#import "Fox.h" +#import "FOXSpecHelper.h" +#import "QueueRemoveTransition.h" +#import "QueueAddTransition.h" +#import "Queue.h" +#import "Ticker.h" +#import + +using namespace Cedar::Matchers; +using namespace Cedar::Doubles; + + +SPEC_BEGIN(FOXParallelStateMachineSpec) + +describe(@"FOXParallelStateMachine", ^{ + +#ifdef FOXSPECS_INSTRUMENTED + it(@"should fail if the ticker does not support atomic methods (instrumented yielding)", ^{ + FOXFiniteStateMachine *stateMachine = [[FOXFiniteStateMachine alloc] initWithInitialModelState:@0]; + + FOXTransition *incrTransition = [FOXTransition byCallingSelector:@selector(increment) + nextModelState:^id(NSNumber *modelState, id generatedValue) { + return @(modelState.integerValue + 1); + }]; + FOXTransition *resetTransition = [FOXTransition byCallingSelector:@selector(reset) + nextModelState:^id(id modelState, id generatedValue) { + return @0; + }]; + incrTransition.frequency = 3; + resetTransition.frequency = 1; + + [stateMachine addTransition:incrTransition]; + [stateMachine addTransition:resetTransition]; + + id commandsWithRandom = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + + id property = FOXForAll(commandsWithRandom, ^BOOL(NSArray *tuple) { + FOXProgram *program = tuple[0]; + id random = tuple[1]; + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + __block FOXExecutedProgram *executedProgram = nil; + [scheduler runAndWait:^{ + executedProgram = FOXRunParallelProgram(program, ^id{ + return [Ticker new]; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_falsy; + FOXExecutedProgram *execution = result.smallestFailingValue; + // should be smallest, but isn't right now + execution.serialCommands.count should be_less_than(10); +// execution.serialCommands should be_empty; + }); + + it(@"should pass if the subject has an atomic API (instrumented yielding)", ^{ + FOXFiniteStateMachine *stateMachine = [[FOXFiniteStateMachine alloc] initWithInitialModelState:@0]; + + FOXTransition *incrTransition = [FOXTransition byCallingSelector:@selector(atomicIncrement) + nextModelState:^id(NSNumber *modelState, id generatedValue) { + return @(modelState.integerValue + 1); + }]; + FOXTransition *resetTransition = [FOXTransition byCallingSelector:@selector(atomicReset) + nextModelState:^id(id modelState, id generatedValue) { + return @0; + }]; + incrTransition.frequency = 3; + resetTransition.frequency = 1; + + [stateMachine addTransition:incrTransition]; + [stateMachine addTransition:resetTransition]; + + id parallelCommands = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + id property = FOXForAll(parallelCommands, ^BOOL(NSArray *tuple) { + FOXProgram *program = tuple[0]; + id random = tuple[1]; + + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + __block FOXExecutedProgram *executedProgram = nil; + [scheduler runAndWait:^{ + executedProgram = FOXRunParallelProgram(program, ^id{ + return [Ticker new]; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_truthy; + }); +#endif // FOXSPECS_INSTRUMENTED + + it(@"should pass if the subject has an atomic API (explicit cooperation)", ^{ + FOXFiniteStateMachine *stateMachine = [[FOXFiniteStateMachine alloc] initWithInitialModelState:@0]; + + FOXTransition *incrTransition = [FOXTransition byCallingSelector:@selector(atomicIncrementWithManualInstrumentation) + nextModelState:^id(NSNumber *modelState, id generatedValue) { + return @(modelState.integerValue + 1); + }]; + FOXTransition *resetTransition = [FOXTransition byCallingSelector:@selector(atomicResetWithManualInstrumentation) + nextModelState:^id(id modelState, id generatedValue) { + return @0; + }]; + incrTransition.frequency = 3; + resetTransition.frequency = 1; + + [stateMachine addTransition:incrTransition]; + [stateMachine addTransition:resetTransition]; + + id parallelCommands = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + id property = FOXForAll(parallelCommands, ^BOOL(NSArray *tuple) { + FOXProgram *plan = tuple[0]; + id random = tuple[1]; + + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + __block FOXExecutedProgram *executedProgram = nil; + [scheduler runAndWait:^{ + executedProgram = FOXRunParallelProgram(plan, ^id { + return [Ticker new]; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_truthy; + }); + + it(@"should fail if the ticker does not support atomic methods (explicit cooperation)", ^{ + FOXFiniteStateMachine *stateMachine = [[FOXFiniteStateMachine alloc] initWithInitialModelState:@0]; + + FOXTransition *incrTransition = [FOXTransition byCallingSelector:@selector(incrementWithManualInstrumentation) + nextModelState:^id(NSNumber *modelState, id generatedValue) { + return @(modelState.integerValue + 1); + }]; + FOXTransition *resetTransition = [FOXTransition byCallingSelector:@selector(resetWithManualInstrumentation) + nextModelState:^id(id modelState, id generatedValue) { + return @0; + }]; + incrTransition.frequency = 3; + resetTransition.frequency = 1; + + [stateMachine addTransition:incrTransition]; + [stateMachine addTransition:resetTransition]; + + id parallelCommands = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + id property = FOXForAll(parallelCommands, ^BOOL(NSArray *tuple) { + FOXProgram *pcommands = tuple[0]; + id random = tuple[1]; + + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + + __block FOXExecutedProgram *executedProgram = nil; + [scheduler runAndWait:^{ + executedProgram = FOXRunParallelProgram(pcommands, ^id { + return [Ticker new]; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + FOXRunnerResult *result = [FOXSpecHelper resultForProperty:property]; + result.succeeded should be_falsy; + FOXExecutedProgram *execution = result.smallestFailingValue; + // should be smallest, but isn't right now + execution.serialCommands.count should be_less_than(10); +// execution.serialCommands should be_empty; + }); +}); + +SPEC_END diff --git a/Foxling/Foxling Compiler/Foxling Compiler b/Foxling/Foxling Compiler/Foxling Compiler new file mode 100755 index 0000000..335bcf4 Binary files /dev/null and b/Foxling/Foxling Compiler/Foxling Compiler differ diff --git a/Foxling/Foxling Compiler/Info.plist b/Foxling/Foxling Compiler/Info.plist new file mode 100644 index 0000000..0dd7e7e --- /dev/null +++ b/Foxling/Foxling Compiler/Info.plist @@ -0,0 +1,48 @@ + + + + + BuildMachineOSBuild + 14A330 + CFBundleDevelopmentRegion + English + CFBundleIdentifier + net.jeffhui.foxling.compilers.clang + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Foxling Clang LLVM 1.0 Compiler Xcode Plug-in + CFBundlePackageType + BNDL + CFBundleShortVersionString + 8.1.1 + CFBundleSignature + clng + CFBundleVersion + 6269 + DTCompiler + net.jeffhui.foxling.compilers.llvm.clang.1_0 + DTPlatformBuild + + DTPlatformVersion + GM + DTSDKBuild + 14A349 + DTSDKName + macosx10.10internal + DTXcode + 0611 + DTXcodeBuild + + XC4Compatible + + XCGCReady + YES + XCPluginHasUI + NO + DVTPlugInCompatibilityUUIDs + + C4A681B0-4A26-480E-93EC-1218098B9AA0 + + + diff --git a/Foxling/Foxling Compiler/Resources/Default Compiler.xcspec b/Foxling/Foxling Compiler/Resources/Default Compiler.xcspec new file mode 100644 index 0000000..9aa9e3c --- /dev/null +++ b/Foxling/Foxling Compiler/Resources/Default Compiler.xcspec @@ -0,0 +1,41 @@ +/** + Default compiler specification + + Copyright (c) 2000-2012 Apple Inc. + All Rights Reserved. +*/ + +{ Type = Compiler; + Identifier = com.apple.compilers.gcc; + Class = PBXCompilerSpecificationGcc; + Name = "Default Compiler"; + Description = "Default Compiler"; + Version = "Default"; + Vendor = "Apple"; + Architectures = ( + i386, + ppc, + ppc7400, + ppc7450, + ppc970, + ppc64, + "x86_64", + armv6, + armv7, + ); + FileTypes = (sourcecode.c.c, sourcecode.c.objc, sourcecode.cpp.cpp, sourcecode.cpp.objcpp, sourcecode.asm); + BuiltinJambaseRuleName = "ProcessC"; // <== is this still used? A.B. 2004.09.20 + CommandOutputParser = XCGccCommandOutputParser; + OptionConditionFlavors = ( + arch, + sdk, + ); + SupportsHeadermaps = Yes; + DashIFlagAcceptsHeadermaps = No; + UseCPlusPlusCompilerDriverWhenBundlizing = No; + SupportsIsysroot = NO; + ExecDescription = "Compile $(InputFile)"; + ProgressDescription = "Compiling $(CommandProgressByType) source files"; + ExecDescriptionForPrecompile = "Precompile $(InputFile)"; + ProgressDescriptionForPrecompile = "Precompiling $(CommandProgressByType) prefix headers"; +} diff --git a/Foxling/Foxling Compiler/Resources/English.lproj/Default Compiler.strings b/Foxling/Foxling Compiler/Resources/English.lproj/Default Compiler.strings new file mode 100644 index 0000000..6c533ef Binary files /dev/null and b/Foxling/Foxling Compiler/Resources/English.lproj/Default Compiler.strings differ diff --git a/Foxling/Foxling Compiler/Resources/English.lproj/Foxling Compiler.strings b/Foxling/Foxling Compiler/Resources/English.lproj/Foxling Compiler.strings new file mode 100644 index 0000000..d567e6a Binary files /dev/null and b/Foxling/Foxling Compiler/Resources/English.lproj/Foxling Compiler.strings differ diff --git a/Foxling/Foxling Compiler/Resources/Foxling Compiler.xcspec b/Foxling/Foxling Compiler/Resources/Foxling Compiler.xcspec new file mode 100644 index 0000000..25069fb --- /dev/null +++ b/Foxling/Foxling Compiler/Resources/Foxling Compiler.xcspec @@ -0,0 +1,3113 @@ +( + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Type = Compiler; + Class = "XCCompilerSpecificationClang"; + Name = "Foxling Compiler"; + Description = "Foxling Instrumented Clang Compiler"; + Vendor = Fox; + Version = "6.0"; + IsAbstract = NO; + "ShowInCompilerSelectionPopup" = YES; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + "sourcecode.asm", + ); + "OptionConditionFlavors" = ( + arch, + sdk, + ); + "BuiltinJambaseRuleName" = ProcessC; + ExecPath = "$(CLANG)"; + ExecDescription = "Compile $(InputFile)"; + ProgressDescription = "Compiling $(CommandProgressByType) source files"; + "ExecDescriptionForPrecompile" = "Precompile $(InputFile)"; + "ProgressDescriptionForPrecompile" = "Precompiling $(CommandProgressByType) prefix headers"; + "UseCPlusPlusCompilerDriverWhenBundlizing" = Yes; + CommandOutputParser = "XCSimpleBufferedCommandOutputParser"; + SupportsHeadermaps = Yes; + "DashIFlagAcceptsHeadermaps" = Yes; + SupportsIsysroot = Yes; + "SupportsPredictiveCompilation" = No; + "SupportsSeparateUserHeaderPaths" = Yes; + "SupportsMacOSXDeploymentTarget" = Yes; + "SupportsMacOSXMinVersionFlag" = Yes; + "PatternsOfFlagsNotAffectingPrecomps" = ( + "-v", + "-###", + "-H", + "-time", + "-save-temps", + "-W*", + "-w", + "-fdiagnostics-show-note-include-stack", + "-fmacro-backtrace-limit*", + "-fmessage-length*", + "-fcolor-diagnostics", + "-fvectorize", + "-flto", + "-fstrict-aliasing", + "-fno-strict-aliasing", + "-fmodules-autolink", + "-fmodules-prune-interval*", + "-fmodules-prune-after*", + "-fbuild-session-timestamp*", + "-fmodules-validate-once-per-build-session", + ); + "MessageCategoryInfoOptions" = ( + "--print-diagnostic-categories", + ); + Options = ( + { + Name = CLANG; + DisplayName = "Path to FoxlingCompiler Executable"; + Description = "Path to FoxlingCompiler Executable to run"; + Type = Path; + DefaultValue = "$(USER_LIBRARY_DIR)/Application Support/Developer/Shared/Xcode/Plug-ins/Foxling Compiler.xcplugin/Contents/MacOS/Fling"; + Category = Base; + }, + { + Name = "FOXLING_CLANG_EXECUTABLE"; + DisplayName = "Path to Clang Executable"; + Description = "Path to Clang Executable to run. FoxlingCompiler will call this after preprocessing the source."; + Type = Path; + DefaultValue = clang; + Category = Base; + "CommandLinePrefixFlag" = "--foxling-compiler-clang="; + }, + { + Name = "FOXLING_PRINT_SOURCE"; + DisplayName = "Print Source after Preprocessing"; + Description = "Print Source after Preprocessing. Useful to debug the FoxlingCompiler."; + Type = Boolean; + DefaultValue = NO; + Category = Base; + CommandLineArgs = { + YES = ( + "--foxling-compiler-print-source", + ); + NO = (); + }; + }, + { + Name = arch; + Type = String; + CommandLineArgs = { + "<>" = ( + "-arch", + "$(value)", + ); + }; + }, + { + Name = "diagnostic_message_length"; + Type = String; + DefaultValue = 0; + "CommandLinePrefixFlag" = "-fmessage-length="; + }, + { + Name = "print_note_include_stack"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-fdiagnostics-show-note-include-stack", + ); + NO = (); + }; + }, + { + Name = "CLANG_MACRO_BACKTRACE_LIMIT"; + Type = String; + DefaultValue = 0; + "CommandLinePrefixFlag" = "-fmacro-backtrace-limit="; + }, + { + Name = "CLANG_RETAIN_COMMENTS_FROM_SYSTEM_HEADERS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fretain-comments-from-system-headers", + ); + NO = (); + }; + }, + { + Name = "CLANG_COLOR_DIAGNOSTICS"; + Type = Boolean; + DefaultValue = "$(COLOR_DIAGNOSTICS)"; + CommandLineArgs = { + YES = ( + "-fcolor-diagnostics", + ); + NO = (); + }; + }, + { + Name = "GCC_INPUT_FILETYPE"; + Type = Enumeration; + AllowedValues = ( + automatic, + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + DefaultValue = automatic; + Category = Language; + }, + { + Name = "GCC_OPERATION"; + Type = Enumeration; + AllowedValues = ( + compile, + "generate-preprocessed", + "generate-assembler", + precompile, + "separate-symbols", + ); + DefaultValue = compile; + }, + { + Name = "GCC_USE_STANDARD_INCLUDE_SEARCHING"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-nostdinc", + ); + }; + Category = Language; + }, + { + Name = "GCC_C_LANGUAGE_STANDARD"; + Type = Enumeration; + AllowedValues = ( + ansi, + c89, + gnu89, + c99, + gnu99, + c11, + gnu11, + "compiler-default", + ); + DefaultValue = "compiler-default"; + CommandLineArgs = { + ansi = ( + "-ansi", + ); + "compiler-default" = (); + "<>" = ( + "-std=$(value)", + ); + }; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + ); + Category = Language; + }, + { + Name = "CLANG_CXX_LANGUAGE_STANDARD"; + Type = Enumeration; + AllowedValues = ( + "c++98", + "gnu++98", + "c++0x", + "gnu++0x", + "c++14", + "gnu++14", + "compiler-default", + ); + DefaultValue = "compiler-default"; + CommandLineArgs = { + "compiler-default" = (); + "c++0x" = ( + "-std=c++11", + ); + "gnu++0x" = ( + "-std=gnu++11", + ); + "c++14" = ( + "-std=c++1y", + ); + "gnu++14" = ( + "-std=gnu++1y", + ); + "<>" = ( + "-std=$(value)", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = LanguageCXX; + }, + { + Name = "CLANG_CXX_LIBRARY"; + Type = Enumeration; + AllowedValues = ( + "libstdc++", + "libc++", + "compiler-default", + ); + DefaultValue = "compiler-default"; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + CommandLineArgs = { + "compiler-default" = (); + "<>" = ( + "-stdlib=$(value)", + ); + }; + AdditionalLinkerArgs = { + "compiler-default" = (); + "<>" = ( + "-stdlib=$(value)", + ); + }; + AppearsAfter = "CLANG_CXX_LANGUAGE_STANDARD"; + Category = LanguageCXX; + }, + { + Name = "GCC_ENABLE_OBJC_GC"; + Type = Enumeration; + AllowedValues = ( + unsupported, + supported, + required, + ); + DefaultValue = unsupported; + CommandLineArgs = { + unsupported = (); + supported = ( + "-fobjc-gc", + ); + required = ( + "-fobjc-gc-only", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + }, + { + Name = "CLANG_ENABLE_OBJC_ARC"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fobjc-arc", + ); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-fobjc-arc", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = LanguageObjC; + }, + { + Name = "CLANG_LINK_OBJC_RUNTIME"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-fobjc-link-runtime", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = LanguageObjC; + }, + { + Name = "CLANG_ENABLE_MODULES"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fmodules", + ); + NO = (); + }; + Category = LanguageModules; + }, + { + Name = "CLANG_MODULE_CACHE_PATH"; + Type = String; + DefaultValue = "$(MODULE_CACHE_DIR)"; + CommandLineArgs = { + "" = (); + "<>" = ( + "-fmodules-cache-path=$(CLANG_MODULE_CACHE_PATH)", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_MODULES_AUTOLINK"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-autolink", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + Category = LanguageModules; + }, + { + Name = "CLANG_MODULES_PRUNE_INTERVAL"; + Type = String; + DefaultValue = 86400; + CommandLineArgs = { + "" = (); + "<>" = ( + "-fmodules-prune-interval=$(value)", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_MODULES_PRUNE_AFTER"; + Type = String; + DefaultValue = 345600; + CommandLineArgs = { + "" = (); + "<>" = ( + "-fmodules-prune-after=$(value)", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_MODULES_IGNORE_MACROS"; + Type = StringList; + DefaultValue = "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)"; + CommandLineArgs = ( + "-fmodules-ignore-macro=$(value)", + ); + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_MODULES_VALIDATE_SYSTEM_HEADERS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fmodules-validate-system-headers", + ); + NO = (); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_MODULES_VALIDATION_TIMESTAMP"; + Type = String; + DefaultValue = ""; + CommandLineArgs = { + "" = (); + "<>" = ( + "-fbuild-session-timestamp=$(value)", + "-fmodules-validate-once-per-build-session", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + }, + { + Name = "CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = (); + NO = ( + "-Wnon-modular-include-in-framework-module", + "-Werror=non-modular-include-in-framework-module", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES"; + Category = LanguageModules; + DisplayName = "Allow Non-modular Includes In Framework Modules"; + Description = "Enabling this setting allows non-modular includes to be used from within framework modules. This is inherently unsafe, as such headers might cause duplicate definitions when used by any client that imports both the framework and the non-modular includes themselves. [CLANG_ENABLE_MODULES]"; + }, + { + Name = "CLANG_ENABLE_MODULE_IMPLEMENTATION_OF"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + NO = (); + YES = ( + "-fmodule-implementation-of", + "$(PRODUCT_MODULE_NAME)", + ); + }; + Condition = "$(CLANG_ENABLE_MODULES) == YES && $(DEFINES_MODULE) == YES"; + }, + { + Name = "CLANG_ENABLE_APP_EXTENSION"; + Type = Boolean; + DefaultValue = "$(APPLICATION_EXTENSION_API_ONLY)"; + CommandLineArgs = { + YES = ( + "-fapplication-extension", + ); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-fapplication-extension", + ); + NO = (); + }; + }, + { + Name = "GCC_CHAR_IS_UNSIGNED_CHAR"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-funsigned-char", + ); + NO = (); + }; + Category = Language; + }, + { + Name = "GCC_ENABLE_ASM_KEYWORD"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-asm", + ); + }; + Category = Language; + }, + { + Name = "GCC_ENABLE_BUILTIN_FUNCTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-builtin", + ); + }; + Category = Language; + }, + { + Name = "GCC_ENABLE_TRIGRAPHS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-trigraphs", + ); + NO = ( + "-Wno-trigraphs", + ); + }; + Category = Language; + }, + { + Name = "GCC_ENABLE_CPP_EXCEPTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-exceptions", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = LanguageCXX; + }, + { + Name = "GCC_ENABLE_CPP_RTTI"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-rtti", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = LanguageCXX; + }, + { + Name = "GCC_ENABLE_PASCAL_STRINGS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-fpascal-strings", + ); + NO = (); + }; + Category = Language; + }, + { + Name = "GCC_SHORT_ENUMS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fshort-enums", + ); + NO = (); + }; + Category = Language; + }, + { + Name = "GCC_LINK_WITH_DYNAMIC_LIBRARIES"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-static", + ); + }; + Category = Language; + }, + { + Name = "GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-msoft-float", + ); + NO = (); + }; + Category = Language; + }, + { + Name = "GCC_PREFIX_HEADER"; + Type = String; + DefaultValue = ""; + Category = Language; + ConditionFlavors = (); + }, + { + Name = "GCC_PRECOMPILE_PREFIX_HEADER"; + Type = Boolean; + DefaultValue = NO; + Category = Language; + ConditionFlavors = (); + }, + { + Name = "GCC_INCREASE_PRECOMPILED_HEADER_SHARING"; + Type = Boolean; + DefaultValue = NO; + Category = Language; + ConditionFlavors = (); + }, + { + Name = "OTHER_CFLAGS"; + Type = StringList; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + ); + Category = CustomFlags; + }, + { + Name = "OTHER_CPLUSPLUSFLAGS"; + Type = StringList; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = CustomFlags; + }, + { + Name = "GCC_GENERATE_DEBUGGING_SYMBOLS"; + Type = Boolean; + DefaultValue = YES; + Category = CodeGeneration; + }, + { + Name = "GCC_OPTIMIZATION_LEVEL"; + Type = Enumeration; + AllowedValues = ( + 0, + 1, + 2, + 3, + s, + fast, + ); + DefaultValue = s; + CommandLineArgs = ( + "-O$(value)", + ); + Category = CodeGeneration; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_0"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_1"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_2"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_3"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_s"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "LLVM_OPTIMIZATION_LEVEL_VAL_fast"; + Type = Boolean; + DefaultValue = YES; + }, + { + Name = "LLVM_IMPLICIT_AGGRESSIVE_OPTIMIZATIONS"; + Type = Boolean; + DefaultValue = "$(LLVM_OPTIMIZATION_LEVEL_VAL_$(GCC_OPTIMIZATION_LEVEL))"; + }, + { + Name = "LLVM_LTO"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-flto", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_NO_COMMON_BLOCKS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fno-common", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_REUSE_STRINGS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fwritable-strings", + ); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_DYNAMIC_NO_PIC"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-mdynamic-no-pic", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_ENABLE_KERNEL_DEVELOPMENT"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-mkernel", + ); + NO = (); + }; + Category = CodeGeneration; + Description = "Activating this setting enables kernel development mode. This mode sets -static, -fno-common, -fno-cxa-atexit, -fno-exceptions, -fno-non-call-exceptions, -fapple-kext, -fno-weak and -fno-rtti where applicable. This mode also sets -mno-altivec, -msoft-float, -fno-builtin and -mlong-branch for PowerPC targets. [GCC_ENABLE_KERNEL_DEVELOPMENT, -mkernel]"; + }, + { + Name = "GCC_TREAT_WARNINGS_AS_ERRORS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Werror", + ); + NO = (); + }; + Category = WarningsPolicy; + }, + { + Name = "GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Werror-implicit-function-declaration", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + ); + Category = Warnings; + AppearsAfter = "GCC_TREAT_WARNINGS_AS_ERRORS"; + }, + { + Name = "GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Werror=incompatible-pointer-types", + ); + NO = (); + }; + Category = Warnings; + AppearsAfter = "GCC_TREAT_WARNINGS_AS_ERRORS"; + }, + { + Name = "GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wmissing-field-initializers", + ); + NO = ( + "-Wno-missing-field-initializers", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_ABOUT_MISSING_PROTOTYPES"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wmissing-prototypes", + ); + NO = ( + "-Wno-missing-prototypes", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_ABOUT_RETURN_TYPE"; + Type = Enumeration; + AllowedValues = ( + YES, + NO, + "YES_ERROR", + ); + DefaultValue = NO; + CommandLineArgs = { + YES = (); + "YES_ERROR" = ( + "-Werror=return-type", + ); + NO = ( + "-Wno-return-type", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_DOCUMENTATION_COMMENTS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wdocumentation", + ); + NO = (); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_UNREACHABLE_CODE"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunreachable-code", + ); + NO = (); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wimplicit-atomic-properties", + ); + NO = ( + "-Wno-implicit-atomic-properties", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_DIRECT_OBJC_ISA_USAGE"; + Type = Enumeration; + AllowedValues = ( + YES, + NO, + "YES_ERROR", + ); + DefaultValue = YES; + CommandLineArgs = { + YES = (); + "YES_ERROR" = ( + "-Werror=deprecated-objc-isa-usage", + ); + NO = ( + "-Wno-deprecated-objc-isa-usage", + ); + }; + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wobjc-missing-property-synthesis", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_OBJC_ROOT_CLASS"; + Type = Enumeration; + AllowedValues = ( + YES, + NO, + "YES_ERROR", + ); + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Wno-objc-root-class", + ); + "YES_ERROR" = ( + "-Werror=objc-root-class", + ); + }; + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_OBJC_RECEIVER_WEAK"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wreceiver-is-weak", + ); + NO = ( + "-Wno-receiver-is-weak", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjCARC; + }, + { + Name = "CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Warc-repeated-use-of-weak", + ); + NO = ( + "-Wno-arc-repeated-use-of-weak", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjCARC; + }, + { + Name = "CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wexplicit-ownership-type", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjCARC; + }, + { + Name = "CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wimplicit-retain-self", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjCARC; + }, + { + Name = "GCC_WARN_NON_VIRTUAL_DESTRUCTOR"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wnon-virtual-dtor", + ); + NO = ( + "-Wno-non-virtual-dtor", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = WarningsCXX; + }, + { + Name = "GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Woverloaded-virtual", + ); + NO = ( + "-Wno-overloaded-virtual", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = WarningsCXX; + }, + { + Name = "CLANG_WARN__EXIT_TIME_DESTRUCTORS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wexit-time-destructors", + ); + NO = ( + "-Wno-exit-time-destructors", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = WarningsCXX; + }, + { + Name = "CLANG_WARN__ARC_BRIDGE_CAST_NONARC"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Wno-arc-bridge-casts-disallowed-in-nonarc", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjCARC; + }, + { + Name = "CLANG_WARN__DUPLICATE_METHOD_MATCH"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wduplicate-method-match", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "GCC_WARN_TYPECHECK_CALLS_TO_PRINTF"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Wno-format", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wmissing-braces", + ); + NO = ( + "-Wno-missing-braces", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_MISSING_PARENTHESES"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wparentheses", + ); + NO = ( + "-Wno-parentheses", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_CHECK_SWITCH_STATEMENTS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wswitch", + ); + NO = ( + "-Wno-switch", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNUSED_FUNCTION"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunused-function", + ); + NO = ( + "-Wno-unused-function", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNUSED_LABEL"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunused-label", + ); + NO = ( + "-Wno-unused-label", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_EMPTY_BODY"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wempty-body", + ); + NO = ( + "-Wno-empty-body", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNINITIALIZED_AUTOS"; + Type = Enumeration; + AllowedValues = ( + YES, + "YES_AGGRESSIVE", + NO, + ); + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wuninitialized", + ); + "YES_AGGRESSIVE" = ( + "-Wconditional-uninitialized", + ); + NO = ( + "-Wno-uninitialized", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNKNOWN_PRAGMAS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunknown-pragmas", + ); + NO = ( + "-Wno-unknown-pragmas", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_INHIBIT_ALL_WARNINGS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-w", + ); + NO = (); + }; + Category = WarningsPolicy; + }, + { + Name = "GCC_WARN_PEDANTIC"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-pedantic", + ); + NO = (); + }; + Category = WarningsPolicy; + }, + { + Name = "GCC_WARN_SHADOW"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wshadow", + ); + NO = ( + "-Wno-shadow", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_FOUR_CHARACTER_CONSTANTS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wfour-char-constants", + ); + NO = ( + "-Wno-four-char-constants", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wconversion", + ); + NO = ( + "-Wno-conversion", + ); + }; + CommonOption = NO; + Category = Warnings; + }, + { + Name = "CLANG_WARN_CONSTANT_CONVERSION"; + Type = Boolean; + DefaultValue = "$(CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION)"; + CommandLineArgs = { + YES = ( + "-Wconstant-conversion", + ); + NO = ( + "-Wno-constant-conversion", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_INT_CONVERSION"; + Type = Boolean; + DefaultValue = "$(CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION)"; + CommandLineArgs = { + YES = ( + "-Wint-conversion", + ); + NO = ( + "-Wno-int-conversion", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_BOOL_CONVERSION"; + Type = Boolean; + DefaultValue = "$(CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION)"; + CommandLineArgs = { + YES = ( + "-Wbool-conversion", + ); + NO = ( + "-Wno-bool-conversion", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_ENUM_CONVERSION"; + Type = Boolean; + DefaultValue = "$(CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION)"; + CommandLineArgs = { + YES = ( + "-Wenum-conversion", + ); + NO = ( + "-Wno-enum-conversion", + ); + }; + Category = Warnings; + }, + { + Name = "CLANG_WARN_ASSIGN_ENUM"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wassign-enum", + ); + NO = (); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_SIGN_COMPARE"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wsign-compare", + ); + NO = (); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wselector", + ); + NO = ( + "-Wno-selector", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "GCC_WARN_STRICT_SELECTOR_MATCH"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wstrict-selector-match", + ); + NO = ( + "-Wno-strict-selector-match", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "GCC_WARN_UNDECLARED_SELECTOR"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wundeclared-selector", + ); + NO = ( + "-Wno-undeclared-selector", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wdeprecated-implementations", + ); + NO = ( + "-Wno-deprecated-implementations", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "CLANG_WARN_CXX0X_EXTENSIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wc++11-extensions", + ); + NO = ( + "-Wno-c++11-extensions", + ); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Category = WarningsCXX; + }, + { + Name = "WARNING_CFLAGS"; + Type = StringList; + DefaultValue = ""; + Category = CustomFlags; + }, + { + Name = "GCC_PREPROCESSOR_DEFINITIONS"; + Type = StringList; + DefaultValue = ""; + CommandLineArgs = ( + "-D$(value)", + ); + Category = Preprocessing; + }, + { + Name = "GCC_PRODUCT_TYPE_PREPROCESSOR_DEFINITIONS"; + Type = StringList; + DefaultValue = ""; + CommandLineArgs = ( + "-D$(value)", + ); + }, + { + Name = "GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS"; + Type = StringList; + DefaultValue = ""; + Category = Preprocessing; + }, + { + Name = "ENABLE_NS_ASSERTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-DNS_BLOCK_ASSERTIONS=1", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = Preprocessing; + }, + { + Name = "ENABLE_STRICT_OBJC_MSGSEND"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + NO = (); + YES = ( + "-DOBJC_OLD_DISPATCH_PROTOTYPES=0", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = Preprocessing; + }, + { + Name = "USE_HEADERMAP"; + Type = Boolean; + DefaultValue = YES; + }, + { + Name = "HEADERMAP_FILE_FORMAT"; + Type = Enumeration; + AllowedValues = ( + traditional, + ); + DefaultValue = traditional; + }, + { + Name = "CPP_HEADERMAP_FILE"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME).hmap"; + }, + { + Name = "CPP_HEADERMAP_FILE_FOR_GENERATED_FILES"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME)-generated-files.hmap"; + }, + { + Name = "CPP_HEADERMAP_FILE_FOR_OWN_TARGET_HEADERS"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME)-own-target-headers.hmap"; + }, + { + Name = "CPP_HEADERMAP_FILE_FOR_ALL_TARGET_HEADERS"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME)-all-target-headers.hmap"; + }, + { + Name = "CPP_HEADERMAP_FILE_FOR_ALL_NON_FRAMEWORK_TARGET_HEADERS"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME)-all-non-framework-target-headers.hmap"; + }, + { + Name = "CPP_HEADERMAP_FILE_FOR_PROJECT_FILES"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME)-project-headers.hmap"; + }, + { + Name = "CPP_HEADERMAP_PRODUCT_HEADERS_VFS_FILE"; + Type = Path; + DefaultValue = "$(PROJECT_TEMP_DIR)/all-product-headers.yaml"; + }, + { + Name = "USE_HEADER_SYMLINKS"; + Type = Boolean; + DefaultValue = NO; + }, + { + Name = "CPP_HEADER_SYMLINKS_DIR"; + Type = Path; + DefaultValue = "$(TEMP_DIR)/$(PRODUCT_NAME).hdrs"; + }, + { + Name = SDKROOT; + Type = Path; + CommandLineFlag = "-isysroot"; + }, + { + Name = "GCC_USE_GCC3_PFE_SUPPORT"; + Type = Boolean; + DefaultValue = YES; + }, + { + Name = "GCC_PFE_FILE_C_DIALECTS"; + Type = StringList; + DefaultValue = "c objective-c c++ objective-c++"; + }, + { + Name = "ENABLE_APPLE_KEXT_CODE_GENERATION"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fapple-kext", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + }, + { + Name = "GCC_WARN_UNUSED_PARAMETER"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunused-parameter", + ); + NO = ( + "-Wno-unused-parameter", + ); + }; + AppearsAfter = "GCC_WARN_UNUSED_LABEL"; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNUSED_VARIABLE"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wunused-variable", + ); + NO = ( + "-Wno-unused-variable", + ); + }; + AppearsAfter = "GCC_WARN_UNUSED_PARAMETER"; + Category = Warnings; + }, + { + Name = "GCC_WARN_UNUSED_VALUE"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wunused-value", + ); + NO = ( + "-Wno-unused-value", + ); + }; + AppearsAfter = "GCC_WARN_UNUSED_VARIABLE"; + Category = Warnings; + }, + { + Name = "GCC_ENABLE_EXCEPTIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineFlag = "-fexceptions"; + }, + { + Name = "GCC_ENABLE_OBJC_EXCEPTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-objc-exceptions", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = LanguageObjC; + }, + { + Name = "GCC_CW_ASM_SYNTAX"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-fasm-blocks", + ); + NO = (); + }; + Architectures = ( + i386, + "x86_64", + ); + Category = Language; + }, + { + Name = "GCC_UNROLL_LOOPS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-funroll-loops", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_FAST_MATH"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-ffast-math", + ); + NO = (); + }; + Condition = "$(LLVM_IMPLICIT_AGGRESSIVE_OPTIMIZATIONS) == NO"; + Category = CodeGeneration; + }, + { + Name = "GCC_STRICT_ALIASING"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-fstrict-aliasing", + ); + NO = ( + "-fno-strict-aliasing", + ); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_INSTRUMENT_PROGRAM_FLOW_ARCS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fprofile-arcs", + ); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-fprofile-arcs", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_GENERATE_TEST_COVERAGE_FILES"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-ftest-coverage", + ); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-ftest-coverage", + ); + NO = (); + }; + Category = CodeGeneration; + }, + { + Name = "GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wprotocol", + ); + NO = ( + "-Wno-protocol", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = WarningsObjC; + }, + { + Name = "GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wdeprecated-declarations", + ); + NO = ( + "-Wno-deprecated-declarations", + ); + }; + Category = Warnings; + }, + { + Name = "GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO"; + Type = Boolean; + DefaultValue = YES; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + CommandLineArgs = { + YES = ( + "-Winvalid-offsetof", + ); + NO = ( + "-Wno-invalid-offsetof", + ); + }; + Category = WarningsCXX; + }, + { + Name = "GCC_MACOSX_VERSION_MIN"; + Type = String; + DefaultValue = "$(MACOSX_DEPLOYMENT_TARGET)"; + CommandLineArgs = { + "" = (); + "<>" = ( + "-mmacosx-version-min=$(value)", + ); + }; + }, + { + Name = "GCC_DEBUG_INFORMATION_FORMAT"; + Type = Enumeration; + AllowedValues = ( + dwarf, + "dwarf-with-dsym", + ); + CommandLineArgs = { + dwarf = ( + "-g", + ); + "dwarf-with-dsym" = ( + "-g", + ); + "<>" = (); + }; + DefaultValue = "$(DEBUG_INFORMATION_FORMAT)"; + Condition = "$(GCC_GENERATE_DEBUGGING_SYMBOLS)"; + CommonOption = NO; + }, + { + Name = "CLANG_DEBUG_INFORMATION_LEVEL"; + Type = Enumeration; + AllowedValues = ( + default, + "line-tables-only", + ); + DefaultValue = default; + CommandLineArgs = { + default = (); + "line-tables-only" = ( + "-gline-tables-only", + ); + }; + Condition = "$(GCC_GENERATE_DEBUGGING_SYMBOLS)"; + CommonOption = NO; + Category = CodeGeneration; + }, + { + Name = "GCC_ENABLE_SSE3_EXTENSIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = (); + NO = (); + }; + Architectures = ( + i386, + "x86_64", + ); + }, + { + Name = "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = (); + NO = (); + }; + Architectures = ( + i386, + "x86_64", + ); + }, + { + Name = "GCC_ENABLE_SSE41_EXTENSIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = (); + NO = (); + }; + Architectures = ( + i386, + "x86_64", + ); + }, + { + Name = "GCC_ENABLE_SSE42_EXTENSIONS"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = (); + NO = (); + }; + Architectures = ( + i386, + "x86_64", + ); + }, + { + Name = "DEFAULT_SSE_LEVEL_3_YES"; + Type = String; + DefaultValue = sse3; + }, + { + Name = "DEFAULT_SSE_LEVEL_3_NO"; + Type = String; + DefaultValue = default; + }, + { + Name = "DEFAULT_SSE_LEVEL_3_SUPPLEMENTAL_YES"; + Type = String; + DefaultValue = ssse3; + }, + { + Name = "DEFAULT_SSE_LEVEL_3_SUPPLEMENTAL_NO"; + Type = String; + DefaultValue = "$(DEFAULT_SSE_LEVEL_3_$(GCC_ENABLE_SSE3_EXTENSIONS))"; + }, + { + Name = "DEFAULT_SSE_LEVEL_4_1_YES"; + Type = String; + DefaultValue = "sse4.1"; + }, + { + Name = "DEFAULT_SSE_LEVEL_4_1_NO"; + Type = String; + DefaultValue = "$(DEFAULT_SSE_LEVEL_3_SUPPLEMENTAL_$(GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS))"; + }, + { + Name = "DEFAULT_SSE_LEVEL_4_2_YES"; + Type = String; + DefaultValue = "sse4.2"; + }, + { + Name = "DEFAULT_SSE_LEVEL_4_2_NO"; + Type = String; + DefaultValue = "$(DEFAULT_SSE_LEVEL_4_1_$(GCC_ENABLE_SSE41_EXTENSIONS))"; + }, + { + Name = "CLANG_X86_VECTOR_INSTRUCTIONS"; + Type = Enumeration; + AllowedValues = ( + default, + sse3, + ssse3, + "sse4.1", + "sse4.2", + avx, + avx2, + ); + AvoidMacroDefinition = YES; + DisplayName = "Enable Additional Vector Extensions"; + DefaultValue = "$(DEFAULT_SSE_LEVEL_4_2_$(GCC_ENABLE_SSE42_EXTENSIONS))"; + CommandLineArgs = { + default = (); + "<>" = ( + "-m$(value)", + ); + }; + Architectures = ( + i386, + "x86_64", + ); + Category = CodeGeneration; + Description = "Enables the use of extended vector instructions. Only used when targeting Intel architectures. [CLANG_X86_VECTOR_INSTRUCTIONS]"; + }, + { + Name = "GCC_SYMBOLS_PRIVATE_EXTERN"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fvisibility=hidden", + ); + NO = (); + }; + AppearsAfter = "GCC_FEEDBACK_DIRECTED_OPTIMIZATION"; + Category = CodeGeneration; + DisplayName = "Symbols Hidden by Default"; + Description = "When enabled, all symbols are declared 'private extern' unless explicitly marked to be exported using '__attribute__((visibility(\"default\")))' in code. If not enabled, all symbols are exported unless explicitly marked as 'private extern'.\n For more information, see . [GCC_SYMBOLS_PRIVATE_EXTERN, -fvisibility=hidden]"; + }, + { + Name = "GCC_INLINES_ARE_PRIVATE_EXTERN"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fvisibility-inlines-hidden", + ); + NO = (); + }; + AppearsAfter = "GCC_SYMBOLS_PRIVATE_EXTERN"; + Category = CodeGeneration; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + DisplayName = "Inline Methods Hidden"; + Description = "When enabled, out-of-line copies of inline methods are declared 'private extern'. [GCC_INLINES_ARE_PRIVATE_EXTERN, -fvisibility-inlines-hidden]"; + }, + { + Name = "GCC_THREADSAFE_STATICS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-fno-threadsafe-statics", + ); + }; + AppearsAfter = "GCC_INLINES_ARE_PRIVATE_EXTERN"; + Category = CodeGeneration; + FileTypes = ( + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + DisplayName = "Statics are Thread-Safe"; + Description = "Emits extra code to use the routines specified in the C++ ABI for thread-safe initialization of local statics. You can disable this option to reduce code size slightly in code that doesn't need to be thread-safe. [GCC_THREADSAFE_STATICS, -fno-threadsafe-statics]"; + }, + { + Name = "GCC_WARN_ABOUT_POINTER_SIGNEDNESS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Wpointer-sign", + ); + NO = ( + "-Wno-pointer-sign", + ); + }; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + ); + AppearsAfter = "GCC_WARN_SIGN_COMPARE"; + Category = Warnings; + CommonOption = YES; + DisplayName = "Pointer Sign Comparison"; + Description = "Warn when pointers passed via arguments or assigned to a variable differ in sign. [GCC_WARN_ABOUT_POINTER_SIGNEDNESS, -Wno-pointer-sign]"; + }, + { + Name = "GCC_WARN_ABOUT_MISSING_NEWLINE"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wnewline-eof", + ); + NO = ( + "-Wno-newline-eof", + ); + }; + AppearsAfter = "GCC_WARN_ABOUT_POINTER_SIGNEDNESS"; + Category = Warnings; + CommonOption = NO; + DisplayName = "Missing Newline At End Of File"; + Description = "Warn when a source file does not end with a newline. [GCC_WARN_ABOUT_MISSING_NEWLINE, -Wnewline-eof]"; + }, + { + Name = "CLANG_WARN_IMPLICIT_SIGN_CONVERSION"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wsign-conversion", + ); + NO = ( + "-Wno-sign-conversion", + ); + }; + CommonOption = NO; + Category = Warnings; + }, + { + Name = "GCC_WARN_64_TO_32_BIT_CONVERSION"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Wshorten-64-to-32", + ); + NO = ( + "-Wno-shorten-64-to-32", + ); + }; + AppearsAfter = "GCC_WARN_SIGN_COMPARE"; + Category = Warnings; + CommonOption = NO; + DisplayName = "Implicit Conversion to 32 Bit Type"; + Description = "Warn if a value is implicitly converted from a 64 bit type to a 32 bit type. [GCC_WARN_64_TO_32_BIT_CONVERSION, -Wshorten-64-to-32]"; + }, + { + Name = "GCC_OBJC_ABI_VERSION"; + Type = Enumeration; + AllowedValues = ( + 1, + 2, + ); + DefaultValue = "$(OBJC_ABI_VERSION)"; + CommandLineArgs = { + "" = (); + "<>" = ( + "-fobjc-abi-version=$(value)", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + }, + { + Name = "GCC_OBJC_LEGACY_DISPATCH"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fobjc-legacy-dispatch", + ); + NO = (); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + }, + { + Name = "CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-fprofile-instr-generate", + ); + NO = (); + }; + AdditionalLinkerArgs = { + YES = ( + "-fprofile-instr-generate", + ); + NO = (); + }; + }, + { + Name = "CLANG_OPTIMIZATION_PROFILE_FILE"; + Type = Path; + DefaultValue = "$(SRCROOT)/OptimizationProfiles/$(PROJECT_NAME).profdata"; + Category = CodeGeneration; + }, + { + Name = "CLANG_USE_OPTIMIZATION_PROFILE"; + Type = Boolean; + DefaultValue = NO; + Category = CodeGeneration; + Condition = "! $(CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING)"; + CommandLineArgs = { + YES = ( + "-fprofile-instr-use=$(CLANG_OPTIMIZATION_PROFILE_FILE)", + ); + NO = (); + }; + }, + { + Name = "CLANG_ARC_MIGRATE_PRECHECK"; + Type = Enumeration; + AllowedValues = ( + donothing, + precheck, + ); + DefaultValue = donothing; + CommandLineArgs = { + donothing = (); + precheck = ( + "-ccc-arcmt-check", + ); + }; + }, + { + Name = "CLANG_ARC_MIGRATE_DIR"; + Type = Path; + CommandLineFlag = "-ccc-arcmt-migrate"; + }, + { + Name = "CLANG_OBJC_MIGRATE_DIR"; + Type = Path; + CommandLineFlag = "-ccc-objcmt-migrate"; + }, + { + Name = "CLANG_ARC_MIGRATE_EMIT_ERROR"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-arcmt-migrate-emit-errors", + ); + NO = (); + }; + }, + { + Name = "CLANG_ARC_MIGRATE_REPORT_OUTPUT"; + Type = Path; + CommandLineFlag = "-arcmt-migrate-report-output"; + }, + ); + }, + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0.compiler"; + Type = Compiler; + BasedOn = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Name = "Foxling Instrumented Clang Compiler"; + Description = "Foxling Instrumented Clang Compiler"; + IsAbstract = YES; + "ShowInCompilerSelectionPopup" = NO; + Architectures = ( + i386, + "x86_64", + armv6, + armv7, + ); + "OptionConditionFlavors" = ( + arch, + sdk, + ); + FallbackTools = ( + "com.apple.compilers.llvmgcc42", + ); + "ExecCPlusPlusLinkerPath" = "$(CLANG)++"; + "SupportsGeneratePreprocessedFile" = YES; + "SupportsGenerateAssemblyFile" = YES; + "CommandResultsPostprocessor" = "XCClangResultsPostprocessor"; + DependencyInfoFile = "$(OutputDir)/$(OutputFileBase).d"; + DependencyInfoArgs = ( + "-MMD", + "-MT", + dependencies, + "-MF", + "$(DependencyInfoFile)", + ); + }, + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0.analyzer"; + Type = Compiler; + BasedOn = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Name = "Static Analyzer"; + Description = "Foxling Clang Static Analyzer"; + Architectures = ( + i386, + "x86_64", + armv6, + armv7, + ); + ExecPath = "$(CLANG_ANALYZER_EXEC)"; + RuleName = "Analyze$(CLANG_STATIC_ANALYZER_MODE_ACTION_$(CLANG_STATIC_ANALYZER_MODE)) $(InputFile)"; + ExecDescription = "Analyze$(StaticAnalyzerModeNameDescription) $(InputFile)"; + ProgressDescription = "Analyzing$(StaticAnalyzerModeNameDescription) $(CommandProgressByType) source files"; + OutputDir = "$(CLANG_ANALYZER_OUTPUT_DIR)/StaticAnalyzer/$(PROJECT_NAME)/$(TARGET_NAME)/$(CURRENT_VARIANT)/$(CURRENT_ARCH)"; + OutputFileExtension = plist; + OutputsAreProducts = YES; + IsAbstract = YES; + "ShowInCompilerSelectionPopup" = NO; + "ShowOnlySelfDefinedProperties" = YES; + SoftError = YES; + SupportsAnalyzeFile = YES; + CommandOutputParser = ( + ( + "^([^:]*):([0-9]*):[0-9]*: [^:]*error: (.*)$", + "emit-analyzer-warning", + ), + ( + "^([^:]*):() [^:]*error: (.*)$", + "emit-analyzer-warning", + ), + ( + "^()()error: (.*)$", + "emit-analyzer-warning", + ), + ); + "CommandResultsPostprocessor" = "XCStaticAnalyzerResultsPostprocessor"; + SourceFileOption = "--analyze"; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + Options = ( + { + Name = "CLANG_ANALYZER_EXEC"; + Type = Path; + DefaultValue = "$(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"; + }, + { + Name = "CLANG_ANALYZER_DEFINES"; + Type = String; + DefaultValue = "-D__clang_analyzer__"; + CommandLineArgs = ( + "$(value)", + ); + }, + { + Name = "CLANG_ANALYZER_OUTPUT_DIR"; + Type = Path; + DefaultValue = "$(TEMP_DIR)"; + }, + { + Name = "CLANG_ANALYZER_OUTPUT"; + Type = Enumeration; + AllowedValues = ( + default, + "plist-multi-file", + ); + DefaultValue = "plist-multi-file"; + CommandLineArgs = { + default = (); + "<>" = ( + "-Xclang", + "-analyzer-output=$(value)", + ); + }; + }, + { + Name = "CLANG_ANALYZER_ALTERNATE_EDGES"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + NO = ( + "-Xclang", + "-analyzer-config", + "-Xclang", + "path-diagnostics-alternate=false", + ); + YES = ( + "-Xclang", + "-analyzer-config", + "-Xclang", + "path-diagnostics-alternate=true", + ); + }; + }, + { + Name = "CLANG_ANALYZER_REPORT_MAIN_SOURCE_FILE"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + NO = (); + YES = ( + "-Xclang", + "-analyzer-config", + "-Xclang", + "report-in-main-source-file=true", + ); + }; + }, + { + Name = "RUN_CLANG_STATIC_ANALYZER"; + Type = Boolean; + DefaultValue = NO; + Category = SAPolicy; + }, + { + Name = "CLANG_STATIC_ANALYZER_MODE_ACTION_shallow"; + Type = String; + DefaultValue = Shallow; + }, + { + Name = "CLANG_STATIC_ANALYZER_MODE_ACTION_deep"; + Type = String; + DefaultValue = ""; + }, + { + Name = "CLANG_STATIC_ANALYZER_MODE"; + Type = Enumeration; + AllowedValues = ( + shallow, + deep, + ); + DefaultValue = shallow; + CommandLineArgs = { + shallow = ( + "-Xclang", + "-analyzer-config", + "-Xclang", + "mode=shallow", + ); + deep = (); + }; + AppearsAfter = "RUN_CLANG_STATIC_ANALYZER"; + Category = SAPolicy; + }, + { + Name = "CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION"; + Type = Enumeration; + AllowedValues = ( + shallow, + deep, + ); + DefaultValue = deep; + AppearsAfter = "CLANG_STATIC_ANALYZER_MODE"; + Category = SAPolicy; + }, + { + Name = "CLANG_ANALYZER_DEADCODE_DEADSTORES"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "deadcode.DeadStores", + ); + }; + Category = SACheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_COLLECTIONS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.coreFoundation.containers.PointerSizedValues", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.VariadicMethodTypes", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.NilArg", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_NSCFERROR"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.coreFoundation.CFError", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.NSError", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.IncompatibleMethodTypes", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_UNUSED_IVARS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.UnusedIvars", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_MALLOC"; + Type = Boolean; + DefaultValue = YES; + }, + { + Name = "CLANG_ANALYZER_MEMORY_MANAGEMENT"; + Type = Boolean; + DefaultValue = "$(CLANG_ANALYZER_MALLOC)"; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "unix.Malloc", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "unix.MallocSizeof", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "unix.MismatchedDeallocator", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "cplusplus.NewDelete", + ); + }; + Category = SACheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_RETAIN_COUNT"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.RetainCount", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.ClassRelease", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_ATSYNC"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.AtSync", + ); + }; + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_GCD"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.API", + ); + }; + Category = SACheckers; + }, + { + Name = "CLANG_ANALYZER_OBJC_SELF_INIT"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.cocoa.SelfInit", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = SAObjCCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_KEYCHAIN_API"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = (); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "osx.SecKeychainAPI", + ); + }; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.FloatLoopCounter", + ); + NO = (); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.UncheckedReturn", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.UncheckedReturn", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.getpw", + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.gets", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.getpw", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.gets", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.mkstemp", + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.mktemp", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.mkstemp", + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.mktemp", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.rand", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.rand", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.strcpy", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.strcpy", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.insecureAPI.vfork", + ); + NO = ( + "-Xclang", + "-analyzer-disable-checker", + "-Xclang", + "security.insecureAPI.vfork", + ); + }; + Category = SASecurityCheckers; + }, + { + Name = "CLANG_ANALYZER_SECURITY_BUFFER_OVERFLOW_EXPERIMENTAL"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "core.experimental.Overflow", + "-Xclang", + "-analyzer-checker", + "-Xclang", + "security.experimental.ArrayBoundV2", + "-Xclang", + "-analyzer-max-loop", + "-Xclang", + 100, + ); + NO = (); + }; + }, + { + Name = "CLANG_ANALYZER_OTHER_CHECKERS"; + Type = StringList; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + CommandLineArgs = ( + "-Xclang", + "-analyzer-checker", + "-Xclang", + "$(value)", + ); + }, + { + Name = "CLANG_ANALYZER_OTHER_FLAGS"; + Type = StringList; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + CommandLineArgs = ( + "-Xclang", + "$(value)", + ); + }, + ); + }, + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0.migrator"; + Type = Compiler; + BasedOn = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Name = "ObjC Migrator"; + Description = "Foxling Clang ObjC Migrator"; + Architectures = ( + i386, + "x86_64", + armv6, + armv7, + ); + ExecPath = "$(CLANG)"; + OutputDir = "$(TEMP_DIR)/Migrator"; + OutputFileExtension = remap; + OutputsAreProducts = YES; + IsAbstract = YES; + "CommandResultsPostprocessor" = "XCClangResultsPostprocessor"; + "ShowInCompilerSelectionPopup" = NO; + "ShowOnlySelfDefinedProperties" = YES; + SourceFileOption = "--migrate"; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Options = ( + { + Name = CLANG; + Type = Path; + DefaultValue = clang; + }, + { + Name = "CLANG_MIGRATOR_READWRITE_PROPERTY"; + DisplayName = "Infer readwrite properties"; + Description = "Infer readwrite properties from a getter and setter method"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-readwrite-property", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_READONLY_PROPERTY"; + DisplayName = "Infer readonly properties"; + Description = "Infer readonly properties from getter methods"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-readonly-property", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_ANNOTATIONS"; + DisplayName = "Add attribute annotations"; + Description = "Add attribute annotations to properties and methods"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-annotation", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_INSTANCE_TYPE"; + DisplayName = "Infer instancetype for method result type"; + Description = "Infer instancetype for method result type instead of 'id'"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-instancetype", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_NSENUM_MACROS"; + DisplayName = "Use NS_ENUM/NS_OPTIONS macros"; + Description = "Use NS_ENUM/NS_OPTIONS macros for enumerators"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-ns-macros", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_PROTOCOL_CONFORMANCE"; + DisplayName = "Infer protocol conformance"; + Description = "Infer protocol conformance from the interface methods"; + Type = Boolean; + DefaultValue = NO; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-protocol-conformance", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_PROPERTY_ATOMICITY"; + DisplayName = "Atomicity of inferred properties"; + Description = "Choose the atomicity of the inferred properties"; + Type = Enumeration; + AllowedValues = ( + nonatomic, + atomic, + "NS_NONATOMIC_IOSONLY", + ); + DefaultValue = "NS_NONATOMIC_IOSONLY"; + CommandLineArgs = { + nonatomic = (); + atomic = ( + "-objcmt-atomic-property", + ); + "NS_NONATOMIC_IOSONLY" = ( + "-objcmt-ns-nonatomic-iosonly", + ); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_PUBLIC_HEADERS_ONLY"; + DisplayName = "Only modify public headers"; + Description = "Only modify public headers of a target"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-white-list-dir-path=$(TARGET_BUILD_DIR)/$(PUBLIC_HEADERS_FOLDER_PATH)", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_OBJC_LITERALS"; + DisplayName = "ObjC literals"; + Description = "Enable migration to modern ObjC literals syntax"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-literals", + "-Qunused-arguments", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_OBJC_SUBSCRIPTING"; + DisplayName = "ObjC subscripting"; + Description = "Enable migration to modern ObjC subscripting syntax"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-subscripting", + "-Qunused-arguments", + ); + NO = (); + }; + Category = Modernizer; + }, + { + Name = "CLANG_MIGRATOR_OBJC_DESIGNATED_INIT"; + DisplayName = "Infer designated initializer methods"; + Description = "Infer NS_DESIGNATED_INITIALIZER for designated initializer methods"; + Type = Boolean; + DefaultValue = YES; + CommandLineArgs = { + YES = ( + "-objcmt-migrate-designated-init", + "-Qunused-arguments", + ); + NO = (); + }; + Category = Modernizer; + }, + ); + }, + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0.migrator.xctest"; + Type = Compiler; + BasedOn = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Name = "XCTest Migrator"; + Description = "Foxling Clang XCTest Migrator"; + Architectures = ( + i386, + "x86_64", + armv6, + armv7, + ); + ExecPath = "$(CLANG)"; + OutputDir = "$(TEMP_DIR)/Migrator"; + OutputFileExtension = remap; + OutputsAreProducts = YES; + IsAbstract = YES; + "CommandResultsPostprocessor" = "XCClangResultsPostprocessor"; + "ShowInCompilerSelectionPopup" = NO; + "ShowOnlySelfDefinedProperties" = YES; + SourceFileOption = "--migrate-xct"; + FileTypes = ( + "sourcecode.c.objc", + "sourcecode.cpp.objcpp", + ); + Options = ( + { + Name = CLANG; + Type = Path; + DefaultValue = clang; + }, + ); + }, + { + Identifier = "net.jeffhui.foxling.compilers.llvm.clang.1_0.astbuilder"; + Type = Compiler; + BasedOn = "net.jeffhui.foxling.compilers.llvm.clang.1_0"; + Name = "AST Builder"; + Description = "Foxling Clang AST Builder 1.0"; + FileTypes = ( + "sourcecode.c.c", + "sourcecode.c.objc", + "sourcecode.cpp.cpp", + "sourcecode.cpp.objcpp", + ); + SourceFileOption = "-fsyntax-only"; + OverridingProperties = { + "ENABLE_HEADER_DEPENDENCIES" = YES; + "SHARED_PRECOMPS_DIR" = "$(INDEX_PRECOMPS_DIR)"; + "CLEAN_PRECOMPS" = NO; + "CLANG_RETAIN_COMMENTS_FROM_SYSTEM_HEADERS" = YES; + }; + RuleName = "Build AST from $(InputFile)"; + OutputFileExtension = ast; + IsAbstract = YES; + "ShowInCompilerSelectionPopup" = NO; + "PrunePrecompiledHeaderCache" = NO; + }, +) \ No newline at end of file diff --git a/Foxling/Foxling Compiler/version.plist b/Foxling/Foxling Compiler/version.plist new file mode 100644 index 0000000..414b4e8 --- /dev/null +++ b/Foxling/Foxling Compiler/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 1 + CFBundleShortVersionString + 8.1.1 + CFBundleVersion + 6269 + ProjectName + IDEXcode3ProjectSupport + SourceVersion + 6269000000000000 + + diff --git a/Foxling/Foxling.xcodeproj/project.pbxproj b/Foxling/Foxling.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a09a427 --- /dev/null +++ b/Foxling/Foxling.xcodeproj/project.pbxproj @@ -0,0 +1,1450 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1F23F8D61A5EF26B00C8AD07 /* Foxling Compiler in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1F23F8C81A5EF24B00C8AD07 /* Foxling Compiler */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 1F23F8D71A5EF39800C8AD07 /* Foxling in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1F97E2EE1A55E75A00CE7EA4 /* Foxling */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 1F23F8D81A5EF3BD00C8AD07 /* Fling in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1FF678AF1A5C8E10004F54DA /* Fling */; }; + 1F23F8D91A5EF3BD00C8AD07 /* Fling++ in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1FAB84B81A5EEA2500F9BF07 /* Fling++ */; }; + 1F23F8DB1A5EF41000C8AD07 /* __wmmintrin_aes.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611611A57ECE900970A48 /* __wmmintrin_aes.h */; }; + 1F23F8DC1A5EF41000C8AD07 /* __wmmintrin_pclmul.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611621A57ECE900970A48 /* __wmmintrin_pclmul.h */; }; + 1F23F8DD1A5EF41000C8AD07 /* altivec.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611631A57ECE900970A48 /* altivec.h */; }; + 1F23F8DE1A5EF41000C8AD07 /* ammintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611641A57ECE900970A48 /* ammintrin.h */; }; + 1F23F8DF1A5EF41000C8AD07 /* arm64_neon_internal.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611651A57ECE900970A48 /* arm64_neon_internal.h */; }; + 1F23F8E01A5EF41000C8AD07 /* arm_neon.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611661A57ECE900970A48 /* arm_neon.h */; }; + 1F23F8E11A5EF41000C8AD07 /* avx2intrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611671A57ECE900970A48 /* avx2intrin.h */; }; + 1F23F8E21A5EF41000C8AD07 /* avxintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611681A57ECE900970A48 /* avxintrin.h */; }; + 1F23F8E31A5EF41000C8AD07 /* bmi2intrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611691A57ECE900970A48 /* bmi2intrin.h */; }; + 1F23F8E41A5EF41000C8AD07 /* bmiintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116A1A57ECE900970A48 /* bmiintrin.h */; }; + 1F23F8E51A5EF41000C8AD07 /* cpuid.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116B1A57ECE900970A48 /* cpuid.h */; }; + 1F23F8E61A5EF41000C8AD07 /* emmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116C1A57ECE900970A48 /* emmintrin.h */; }; + 1F23F8E71A5EF41000C8AD07 /* f16cintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116D1A57ECE900970A48 /* f16cintrin.h */; }; + 1F23F8E81A5EF41000C8AD07 /* float.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116E1A57ECE900970A48 /* float.h */; }; + 1F23F8E91A5EF41000C8AD07 /* sanitizer in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1FF679201A5CC7E6004F54DA /* sanitizer */; }; + 1F23F8EA1A5EF41000C8AD07 /* fma4intrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26116F1A57ECE900970A48 /* fma4intrin.h */; }; + 1F23F8EB1A5EF41000C8AD07 /* fmaintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611701A57ECE900970A48 /* fmaintrin.h */; }; + 1F23F8EC1A5EF41000C8AD07 /* immintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611711A57ECE900970A48 /* immintrin.h */; }; + 1F23F8ED1A5EF41000C8AD07 /* Intrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611721A57ECE900970A48 /* Intrin.h */; }; + 1F23F8EE1A5EF41000C8AD07 /* iso646.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611731A57ECE900970A48 /* iso646.h */; }; + 1F23F8EF1A5EF41000C8AD07 /* limits.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611741A57ECE900970A48 /* limits.h */; }; + 1F23F8F01A5EF41000C8AD07 /* lzcntintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611751A57ECE900970A48 /* lzcntintrin.h */; }; + 1F23F8F11A5EF41000C8AD07 /* mm3dnow.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611761A57ECE900970A48 /* mm3dnow.h */; }; + 1F23F8F21A5EF41000C8AD07 /* mm_malloc.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611771A57ECE900970A48 /* mm_malloc.h */; }; + 1F23F8F31A5EF41000C8AD07 /* mmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611781A57ECE900970A48 /* mmintrin.h */; }; + 1F23F8F41A5EF41000C8AD07 /* module.map in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611791A57ECE900970A48 /* module.map */; }; + 1F23F8F51A5EF41000C8AD07 /* nmmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117A1A57ECE900970A48 /* nmmintrin.h */; }; + 1F23F8F61A5EF41000C8AD07 /* pmmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117B1A57ECE900970A48 /* pmmintrin.h */; }; + 1F23F8F71A5EF41000C8AD07 /* popcntintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117C1A57ECE900970A48 /* popcntintrin.h */; }; + 1F23F8F81A5EF41000C8AD07 /* prfchwintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117D1A57ECE900970A48 /* prfchwintrin.h */; }; + 1F23F8F91A5EF41000C8AD07 /* rdseedintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117E1A57ECE900970A48 /* rdseedintrin.h */; }; + 1F23F8FA1A5EF41000C8AD07 /* rtmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26117F1A57ECE900970A48 /* rtmintrin.h */; }; + 1F23F8FB1A5EF41000C8AD07 /* shaintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611881A57ECE900970A48 /* shaintrin.h */; }; + 1F23F8FC1A5EF41000C8AD07 /* smmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611891A57ECE900970A48 /* smmintrin.h */; }; + 1F23F8FD1A5EF41000C8AD07 /* stdalign.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118A1A57ECE900970A48 /* stdalign.h */; }; + 1F23F8FE1A5EF41000C8AD07 /* stdarg.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118B1A57ECE900970A48 /* stdarg.h */; }; + 1F23F8FF1A5EF41000C8AD07 /* stdbool.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118C1A57ECE900970A48 /* stdbool.h */; }; + 1F23F9001A5EF41000C8AD07 /* stddef.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118D1A57ECE900970A48 /* stddef.h */; }; + 1F23F9011A5EF41000C8AD07 /* stdint.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118E1A57ECE900970A48 /* stdint.h */; }; + 1F23F9021A5EF41000C8AD07 /* stdnoreturn.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F26118F1A57ECE900970A48 /* stdnoreturn.h */; }; + 1F23F9031A5EF41000C8AD07 /* tbmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611901A57ECE900970A48 /* tbmintrin.h */; }; + 1F23F9041A5EF41000C8AD07 /* tgmath.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611911A57ECE900970A48 /* tgmath.h */; }; + 1F23F9051A5EF41000C8AD07 /* tmmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611921A57ECE900970A48 /* tmmintrin.h */; }; + 1F23F9061A5EF41000C8AD07 /* unwind.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611931A57ECE900970A48 /* unwind.h */; }; + 1F23F9071A5EF41000C8AD07 /* varargs.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611941A57ECE900970A48 /* varargs.h */; }; + 1F23F9081A5EF41000C8AD07 /* wmmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611951A57ECE900970A48 /* wmmintrin.h */; }; + 1F23F9091A5EF41000C8AD07 /* x86intrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611961A57ECE900970A48 /* x86intrin.h */; }; + 1F23F90A1A5EF41000C8AD07 /* xmmintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611971A57ECE900970A48 /* xmmintrin.h */; }; + 1F23F90B1A5EF41000C8AD07 /* xopintrin.h in Copy Clang Headers */ = {isa = PBXBuildFile; fileRef = 1F2611981A57ECE900970A48 /* xopintrin.h */; }; + 1F23F90D1A5EF42B00C8AD07 /* c++ in Copy C++ Headers */ = {isa = PBXBuildFile; fileRef = 1FF6791F1A5CC7D4004F54DA /* c++ */; }; + 1F23F90E1A5EF42B00C8AD07 /* FlexLexer.h in Copy C++ Headers */ = {isa = PBXBuildFile; fileRef = 1FF6791C1A5CC788004F54DA /* FlexLexer.h */; }; + 1F260FC41A566B0E00970A48 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F97E2E41A55061300CE7EA4 /* libz.dylib */; }; + 1F260FC51A566B1A00970A48 /* libcurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F97E2E61A55062000CE7EA4 /* libcurses.dylib */; }; + 1F2610661A57DEDF00970A48 /* libc++abi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FDC1A57DEDF00970A48 /* libc++abi.a */; }; + 1F2611991A57ED0200970A48 /* __wmmintrin_aes.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611611A57ECE900970A48 /* __wmmintrin_aes.h */; }; + 1F26119A1A57ED0200970A48 /* __wmmintrin_pclmul.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611621A57ECE900970A48 /* __wmmintrin_pclmul.h */; }; + 1F26119B1A57ED0200970A48 /* altivec.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611631A57ECE900970A48 /* altivec.h */; }; + 1F26119C1A57ED0200970A48 /* ammintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611641A57ECE900970A48 /* ammintrin.h */; }; + 1F26119D1A57ED0200970A48 /* arm64_neon_internal.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611651A57ECE900970A48 /* arm64_neon_internal.h */; }; + 1F26119E1A57ED0200970A48 /* arm_neon.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611661A57ECE900970A48 /* arm_neon.h */; }; + 1F26119F1A57ED0200970A48 /* avx2intrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611671A57ECE900970A48 /* avx2intrin.h */; }; + 1F2611A01A57ED0200970A48 /* avxintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611681A57ECE900970A48 /* avxintrin.h */; }; + 1F2611A11A57ED0200970A48 /* bmi2intrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611691A57ECE900970A48 /* bmi2intrin.h */; }; + 1F2611A21A57ED0200970A48 /* bmiintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116A1A57ECE900970A48 /* bmiintrin.h */; }; + 1F2611A31A57ED0200970A48 /* cpuid.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116B1A57ECE900970A48 /* cpuid.h */; }; + 1F2611A41A57ED0200970A48 /* emmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116C1A57ECE900970A48 /* emmintrin.h */; }; + 1F2611A51A57ED0200970A48 /* f16cintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116D1A57ECE900970A48 /* f16cintrin.h */; }; + 1F2611A61A57ED0200970A48 /* float.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116E1A57ECE900970A48 /* float.h */; }; + 1F2611A71A57ED0200970A48 /* fma4intrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26116F1A57ECE900970A48 /* fma4intrin.h */; }; + 1F2611A81A57ED0200970A48 /* fmaintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611701A57ECE900970A48 /* fmaintrin.h */; }; + 1F2611A91A57ED0200970A48 /* immintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611711A57ECE900970A48 /* immintrin.h */; }; + 1F2611AA1A57ED0200970A48 /* Intrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611721A57ECE900970A48 /* Intrin.h */; }; + 1F2611AB1A57ED0200970A48 /* iso646.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611731A57ECE900970A48 /* iso646.h */; }; + 1F2611AC1A57ED0200970A48 /* limits.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611741A57ECE900970A48 /* limits.h */; }; + 1F2611AD1A57ED0200970A48 /* lzcntintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611751A57ECE900970A48 /* lzcntintrin.h */; }; + 1F2611AE1A57ED0200970A48 /* mm3dnow.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611761A57ECE900970A48 /* mm3dnow.h */; }; + 1F2611AF1A57ED0200970A48 /* mm_malloc.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611771A57ECE900970A48 /* mm_malloc.h */; }; + 1F2611B01A57ED0200970A48 /* mmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611781A57ECE900970A48 /* mmintrin.h */; }; + 1F2611B11A57ED0200970A48 /* module.map in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611791A57ECE900970A48 /* module.map */; }; + 1F2611B21A57ED0200970A48 /* nmmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117A1A57ECE900970A48 /* nmmintrin.h */; }; + 1F2611B31A57ED0200970A48 /* pmmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117B1A57ECE900970A48 /* pmmintrin.h */; }; + 1F2611B41A57ED0200970A48 /* popcntintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117C1A57ECE900970A48 /* popcntintrin.h */; }; + 1F2611B51A57ED0200970A48 /* prfchwintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117D1A57ECE900970A48 /* prfchwintrin.h */; }; + 1F2611B61A57ED0200970A48 /* rdseedintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117E1A57ECE900970A48 /* rdseedintrin.h */; }; + 1F2611B71A57ED0200970A48 /* rtmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26117F1A57ECE900970A48 /* rtmintrin.h */; }; + 1F2611BF1A57ED0200970A48 /* shaintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611881A57ECE900970A48 /* shaintrin.h */; }; + 1F2611C01A57ED0200970A48 /* smmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611891A57ECE900970A48 /* smmintrin.h */; }; + 1F2611C11A57ED0200970A48 /* stdalign.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118A1A57ECE900970A48 /* stdalign.h */; }; + 1F2611C21A57ED0200970A48 /* stdarg.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118B1A57ECE900970A48 /* stdarg.h */; }; + 1F2611C31A57ED0300970A48 /* stdbool.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118C1A57ECE900970A48 /* stdbool.h */; }; + 1F2611C41A57ED0300970A48 /* stddef.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118D1A57ECE900970A48 /* stddef.h */; }; + 1F2611C51A57ED0300970A48 /* stdint.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118E1A57ECE900970A48 /* stdint.h */; }; + 1F2611C61A57ED0300970A48 /* stdnoreturn.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F26118F1A57ECE900970A48 /* stdnoreturn.h */; }; + 1F2611C71A57ED0300970A48 /* tbmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611901A57ECE900970A48 /* tbmintrin.h */; }; + 1F2611C81A57ED0300970A48 /* tgmath.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611911A57ECE900970A48 /* tgmath.h */; }; + 1F2611C91A57ED0300970A48 /* tmmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611921A57ECE900970A48 /* tmmintrin.h */; }; + 1F2611CA1A57ED0300970A48 /* unwind.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611931A57ECE900970A48 /* unwind.h */; }; + 1F2611CB1A57ED0300970A48 /* varargs.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611941A57ECE900970A48 /* varargs.h */; }; + 1F2611CC1A57ED0300970A48 /* wmmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611951A57ECE900970A48 /* wmmintrin.h */; }; + 1F2611CD1A57ED0300970A48 /* x86intrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611961A57ECE900970A48 /* x86intrin.h */; }; + 1F2611CE1A57ED0300970A48 /* xmmintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611971A57ECE900970A48 /* xmmintrin.h */; }; + 1F2611CF1A57ED0300970A48 /* xopintrin.h in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1F2611981A57ECE900970A48 /* xopintrin.h */; }; + 1F2611D61A58EEF600970A48 /* objc_property_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F2611D41A58EEF600970A48 /* objc_property_rewriter.cpp */; }; + 1F2611D91A58F0C700970A48 /* objc_message_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F2611D71A58F0C700970A48 /* objc_message_rewriter.cpp */; }; + 1F2611DC1A58F15800970A48 /* unary_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F2611DA1A58F15800970A48 /* unary_rewriter.cpp */; }; + 1F2611E21A58F2E500970A48 /* prefix_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F2611E01A58F2E500970A48 /* prefix_rewriter.cpp */; }; + 1F2611E51A5A035300970A48 /* source_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F2611E31A5A035300970A48 /* source_rewriter.cpp */; }; + 1F97E2F11A55E75A00CE7EA4 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E2F01A55E75A00CE7EA4 /* main.cpp */; }; + 1FA0A34E1A5EF8CD006EA00C /* Default Compiler.xcspec in Resources */ = {isa = PBXBuildFile; fileRef = 1FA0A34B1A5EF8CD006EA00C /* Default Compiler.xcspec */; }; + 1FA0A34F1A5EF8CD006EA00C /* English.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1FA0A34C1A5EF8CD006EA00C /* English.lproj */; }; + 1FA0A3501A5EF8CD006EA00C /* Foxling Compiler.xcspec in Resources */ = {isa = PBXBuildFile; fileRef = 1FA0A34D1A5EF8CD006EA00C /* Foxling Compiler.xcspec */; }; + 1FAB84B91A5EEAAA00F9BF07 /* Fling++ in Copy Binary Files */ = {isa = PBXBuildFile; fileRef = 1FAB84B81A5EEA2500F9BF07 /* Fling++ */; }; + 1FDCAF581A5F002B00012A37 /* libclangApplyReplacements.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FDE1A57DEDF00970A48 /* libclangApplyReplacements.a */; }; + 1FDCAF5A1A5F002B00012A37 /* libclangAST.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE01A57DEDF00970A48 /* libclangAST.a */; }; + 1FDCAF5B1A5F002B00012A37 /* libclangASTMatchers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE11A57DEDF00970A48 /* libclangASTMatchers.a */; }; + 1FDCAF5C1A5F002B00012A37 /* libclangBasic.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE21A57DEDF00970A48 /* libclangBasic.a */; }; + 1FDCAF5D1A5F002B00012A37 /* libclangCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE31A57DEDF00970A48 /* libclangCodeGen.a */; }; + 1FDCAF5E1A5F002B00012A37 /* libclangDriver.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE41A57DEDF00970A48 /* libclangDriver.a */; }; + 1FDCAF5F1A5F002B00012A37 /* libclangDynamicASTMatchers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE51A57DEDF00970A48 /* libclangDynamicASTMatchers.a */; }; + 1FDCAF601A5F002B00012A37 /* libclangEdit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE61A57DEDF00970A48 /* libclangEdit.a */; }; + 1FDCAF611A5F002B00012A37 /* libclangFormat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE71A57DEDF00970A48 /* libclangFormat.a */; }; + 1FDCAF621A5F002B00012A37 /* libclangFrontend.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE81A57DEDF00970A48 /* libclangFrontend.a */; }; + 1FDCAF631A5F002B00012A37 /* libclangFrontendTool.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FE91A57DEDF00970A48 /* libclangFrontendTool.a */; }; + 1FDCAF641A5F002B00012A37 /* libclangIndex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FEA1A57DEDF00970A48 /* libclangIndex.a */; }; + 1FDCAF651A5F002B00012A37 /* libclangLex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FEB1A57DEDF00970A48 /* libclangLex.a */; }; + 1FDCAF661A5F002B00012A37 /* libclangParse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FEC1A57DEDF00970A48 /* libclangParse.a */; }; + 1FDCAF671A5F002B00012A37 /* libclangQuery.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FED1A57DEDF00970A48 /* libclangQuery.a */; }; + 1FDCAF681A5F002B00012A37 /* libclangRename.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FEE1A57DEDF00970A48 /* libclangRename.a */; }; + 1FDCAF691A5F002B00012A37 /* libclangRewrite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FEF1A57DEDF00970A48 /* libclangRewrite.a */; }; + 1FDCAF6A1A5F002B00012A37 /* libclangRewriteFrontend.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF01A57DEDF00970A48 /* libclangRewriteFrontend.a */; }; + 1FDCAF6B1A5F002B00012A37 /* libclangSema.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF11A57DEDF00970A48 /* libclangSema.a */; }; + 1FDCAF6C1A5F002B00012A37 /* libclangSerialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF21A57DEDF00970A48 /* libclangSerialization.a */; }; + 1FDCAF6D1A5F002B00012A37 /* libclangStaticAnalyzerCheckers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF31A57DEDF00970A48 /* libclangStaticAnalyzerCheckers.a */; }; + 1FDCAF6E1A5F002B00012A37 /* libclangStaticAnalyzerCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF41A57DEDF00970A48 /* libclangStaticAnalyzerCore.a */; }; + 1FDCAF6F1A5F002B00012A37 /* libclangStaticAnalyzerFrontend.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FF51A57DEDF00970A48 /* libclangStaticAnalyzerFrontend.a */; }; + 1FDCAF761A5F002B00012A37 /* libclangTooling.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FFC1A57DEDF00970A48 /* libclangTooling.a */; }; + 1FDCAF771A5F002B00012A37 /* libclangToolingCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FFD1A57DEDF00970A48 /* libclangToolingCore.a */; }; + 1FDCAF7A1A5F002B00012A37 /* libLLVMAArch64AsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610001A57DEDF00970A48 /* libLLVMAArch64AsmParser.a */; }; + 1FDCAF7B1A5F002B00012A37 /* libLLVMAArch64AsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610011A57DEDF00970A48 /* libLLVMAArch64AsmPrinter.a */; }; + 1FDCAF7C1A5F002B00012A37 /* libLLVMAArch64CodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610021A57DEDF00970A48 /* libLLVMAArch64CodeGen.a */; }; + 1FDCAF7D1A5F002B00012A37 /* libLLVMAArch64Desc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610031A57DEDF00970A48 /* libLLVMAArch64Desc.a */; }; + 1FDCAF7E1A5F002B00012A37 /* libLLVMAArch64Disassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610041A57DEDF00970A48 /* libLLVMAArch64Disassembler.a */; }; + 1FDCAF7F1A5F002B00012A37 /* libLLVMAArch64Info.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610051A57DEDF00970A48 /* libLLVMAArch64Info.a */; }; + 1FDCAF801A5F002B00012A37 /* libLLVMAArch64Utils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610061A57DEDF00970A48 /* libLLVMAArch64Utils.a */; }; + 1FDCAF811A5F002B00012A37 /* libLLVMAnalysis.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610071A57DEDF00970A48 /* libLLVMAnalysis.a */; }; + 1FDCAF821A5F002B00012A37 /* libLLVMARMAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610081A57DEDF00970A48 /* libLLVMARMAsmParser.a */; }; + 1FDCAF831A5F002B00012A37 /* libLLVMARMAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610091A57DEDF00970A48 /* libLLVMARMAsmPrinter.a */; }; + 1FDCAF841A5F002B00012A37 /* libLLVMARMCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100A1A57DEDF00970A48 /* libLLVMARMCodeGen.a */; }; + 1FDCAF851A5F002B00012A37 /* libLLVMARMDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100B1A57DEDF00970A48 /* libLLVMARMDesc.a */; }; + 1FDCAF861A5F002B00012A37 /* libLLVMARMDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100C1A57DEDF00970A48 /* libLLVMARMDisassembler.a */; }; + 1FDCAF871A5F002B00012A37 /* libLLVMARMInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100D1A57DEDF00970A48 /* libLLVMARMInfo.a */; }; + 1FDCAF881A5F002B00012A37 /* libLLVMAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100E1A57DEDF00970A48 /* libLLVMAsmParser.a */; }; + 1FDCAF891A5F002B00012A37 /* libLLVMAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26100F1A57DEDF00970A48 /* libLLVMAsmPrinter.a */; }; + 1FDCAF8A1A5F002B00012A37 /* libLLVMBitReader.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610101A57DEDF00970A48 /* libLLVMBitReader.a */; }; + 1FDCAF8B1A5F002B00012A37 /* libLLVMBitWriter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610111A57DEDF00970A48 /* libLLVMBitWriter.a */; }; + 1FDCAF8C1A5F002B00012A37 /* libLLVMCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610121A57DEDF00970A48 /* libLLVMCodeGen.a */; }; + 1FDCAF8D1A5F002B00012A37 /* libLLVMCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610131A57DEDF00970A48 /* libLLVMCore.a */; }; + 1FDCAF8E1A5F002B00012A37 /* libLLVMCppBackendCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610141A57DEDF00970A48 /* libLLVMCppBackendCodeGen.a */; }; + 1FDCAF8F1A5F002B00012A37 /* libLLVMCppBackendInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610151A57DEDF00970A48 /* libLLVMCppBackendInfo.a */; }; + 1FDCAF901A5F002B00012A37 /* libLLVMDebugInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610161A57DEDF00970A48 /* libLLVMDebugInfo.a */; }; + 1FDCAF911A5F002B00012A37 /* libLLVMExecutionEngine.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610171A57DEDF00970A48 /* libLLVMExecutionEngine.a */; }; + 1FDCAF921A5F002B00012A37 /* libLLVMHexagonCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610181A57DEDF00970A48 /* libLLVMHexagonCodeGen.a */; }; + 1FDCAF931A5F002B00012A37 /* libLLVMHexagonDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610191A57DEDF00970A48 /* libLLVMHexagonDesc.a */; }; + 1FDCAF941A5F002B00012A37 /* libLLVMHexagonDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101A1A57DEDF00970A48 /* libLLVMHexagonDisassembler.a */; }; + 1FDCAF951A5F002B00012A37 /* libLLVMHexagonInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101B1A57DEDF00970A48 /* libLLVMHexagonInfo.a */; }; + 1FDCAF961A5F002B00012A37 /* libLLVMInstCombine.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101C1A57DEDF00970A48 /* libLLVMInstCombine.a */; }; + 1FDCAF971A5F002B00012A37 /* libLLVMInstrumentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101D1A57DEDF00970A48 /* libLLVMInstrumentation.a */; }; + 1FDCAF981A5F002B00012A37 /* libLLVMInterpreter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101E1A57DEDF00970A48 /* libLLVMInterpreter.a */; }; + 1FDCAF991A5F002B00012A37 /* libLLVMipa.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26101F1A57DEDF00970A48 /* libLLVMipa.a */; }; + 1FDCAF9A1A5F002B00012A37 /* libLLVMipo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610201A57DEDF00970A48 /* libLLVMipo.a */; }; + 1FDCAF9B1A5F002B00012A37 /* libLLVMIRReader.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610211A57DEDF00970A48 /* libLLVMIRReader.a */; }; + 1FDCAF9C1A5F002B00012A37 /* libLLVMLineEditor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610221A57DEDF00970A48 /* libLLVMLineEditor.a */; }; + 1FDCAF9D1A5F002B00012A37 /* libLLVMLinker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610231A57DEDF00970A48 /* libLLVMLinker.a */; }; + 1FDCAF9E1A5F002B00012A37 /* libLLVMLTO.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610241A57DEDF00970A48 /* libLLVMLTO.a */; }; + 1FDCAF9F1A5F002B00012A37 /* libLLVMMC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610251A57DEDF00970A48 /* libLLVMMC.a */; }; + 1FDCAFA01A5F002B00012A37 /* libLLVMMCDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610261A57DEDF00970A48 /* libLLVMMCDisassembler.a */; }; + 1FDCAFA11A5F002B00012A37 /* libLLVMMCJIT.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610271A57DEDF00970A48 /* libLLVMMCJIT.a */; }; + 1FDCAFA21A5F002B00012A37 /* libLLVMMCParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610281A57DEDF00970A48 /* libLLVMMCParser.a */; }; + 1FDCAFA31A5F002B00012A37 /* libLLVMMipsAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610291A57DEDF00970A48 /* libLLVMMipsAsmParser.a */; }; + 1FDCAFA41A5F002B00012A37 /* libLLVMMipsAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102A1A57DEDF00970A48 /* libLLVMMipsAsmPrinter.a */; }; + 1FDCAFA51A5F002B00012A37 /* libLLVMMipsCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102B1A57DEDF00970A48 /* libLLVMMipsCodeGen.a */; }; + 1FDCAFA61A5F002B00012A37 /* libLLVMMipsDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102C1A57DEDF00970A48 /* libLLVMMipsDesc.a */; }; + 1FDCAFA71A5F002B00012A37 /* libLLVMMipsDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102D1A57DEDF00970A48 /* libLLVMMipsDisassembler.a */; }; + 1FDCAFA81A5F002B00012A37 /* libLLVMMipsInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102E1A57DEDF00970A48 /* libLLVMMipsInfo.a */; }; + 1FDCAFA91A5F002B00012A37 /* libLLVMMSP430AsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26102F1A57DEDF00970A48 /* libLLVMMSP430AsmPrinter.a */; }; + 1FDCAFAA1A5F002B00012A37 /* libLLVMMSP430CodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610301A57DEDF00970A48 /* libLLVMMSP430CodeGen.a */; }; + 1FDCAFAB1A5F002B00012A37 /* libLLVMMSP430Desc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610311A57DEDF00970A48 /* libLLVMMSP430Desc.a */; }; + 1FDCAFAC1A5F002B00012A37 /* libLLVMMSP430Info.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610321A57DEDF00970A48 /* libLLVMMSP430Info.a */; }; + 1FDCAFAD1A5F002B00012A37 /* libLLVMNVPTXAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610331A57DEDF00970A48 /* libLLVMNVPTXAsmPrinter.a */; }; + 1FDCAFAE1A5F002B00012A37 /* libLLVMNVPTXCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610341A57DEDF00970A48 /* libLLVMNVPTXCodeGen.a */; }; + 1FDCAFAF1A5F002B00012A37 /* libLLVMNVPTXDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610351A57DEDF00970A48 /* libLLVMNVPTXDesc.a */; }; + 1FDCAFB01A5F002B00012A37 /* libLLVMNVPTXInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610361A57DEDF00970A48 /* libLLVMNVPTXInfo.a */; }; + 1FDCAFB11A5F002B00012A37 /* libLLVMObjCARCOpts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610371A57DEDF00970A48 /* libLLVMObjCARCOpts.a */; }; + 1FDCAFB21A5F002B00012A37 /* libLLVMObject.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610381A57DEDF00970A48 /* libLLVMObject.a */; }; + 1FDCAFB31A5F002B00012A37 /* libLLVMOption.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610391A57DEDF00970A48 /* libLLVMOption.a */; }; + 1FDCAFB41A5F002B00012A37 /* libLLVMPowerPCAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103A1A57DEDF00970A48 /* libLLVMPowerPCAsmParser.a */; }; + 1FDCAFB51A5F002B00012A37 /* libLLVMPowerPCAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103B1A57DEDF00970A48 /* libLLVMPowerPCAsmPrinter.a */; }; + 1FDCAFB61A5F002B00012A37 /* libLLVMPowerPCCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103C1A57DEDF00970A48 /* libLLVMPowerPCCodeGen.a */; }; + 1FDCAFB71A5F002B00012A37 /* libLLVMPowerPCDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103D1A57DEDF00970A48 /* libLLVMPowerPCDesc.a */; }; + 1FDCAFB81A5F002B00012A37 /* libLLVMPowerPCDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103E1A57DEDF00970A48 /* libLLVMPowerPCDisassembler.a */; }; + 1FDCAFB91A5F002B00012A37 /* libLLVMPowerPCInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26103F1A57DEDF00970A48 /* libLLVMPowerPCInfo.a */; }; + 1FDCAFBA1A5F002B00012A37 /* libLLVMProfileData.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610401A57DEDF00970A48 /* libLLVMProfileData.a */; }; + 1FDCAFBB1A5F002B00012A37 /* libLLVMR600AsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610411A57DEDF00970A48 /* libLLVMR600AsmParser.a */; }; + 1FDCAFBC1A5F002B00012A37 /* libLLVMR600AsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610421A57DEDF00970A48 /* libLLVMR600AsmPrinter.a */; }; + 1FDCAFBD1A5F002B00012A37 /* libLLVMR600CodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610431A57DEDF00970A48 /* libLLVMR600CodeGen.a */; }; + 1FDCAFBE1A5F002B00012A37 /* libLLVMR600Desc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610441A57DEDF00970A48 /* libLLVMR600Desc.a */; }; + 1FDCAFBF1A5F002B00012A37 /* libLLVMR600Info.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610451A57DEDF00970A48 /* libLLVMR600Info.a */; }; + 1FDCAFC01A5F002B00012A37 /* libLLVMRuntimeDyld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610461A57DEDF00970A48 /* libLLVMRuntimeDyld.a */; }; + 1FDCAFC11A5F002B00012A37 /* libLLVMScalarOpts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610471A57DEDF00970A48 /* libLLVMScalarOpts.a */; }; + 1FDCAFC21A5F002B00012A37 /* libLLVMSelectionDAG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610481A57DEDF00970A48 /* libLLVMSelectionDAG.a */; }; + 1FDCAFC31A5F002B00012A37 /* libLLVMSparcAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610491A57DEDF00970A48 /* libLLVMSparcAsmParser.a */; }; + 1FDCAFC41A5F002B00012A37 /* libLLVMSparcAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104A1A57DEDF00970A48 /* libLLVMSparcAsmPrinter.a */; }; + 1FDCAFC51A5F002B00012A37 /* libLLVMSparcCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104B1A57DEDF00970A48 /* libLLVMSparcCodeGen.a */; }; + 1FDCAFC61A5F002B00012A37 /* libLLVMSparcDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104C1A57DEDF00970A48 /* libLLVMSparcDesc.a */; }; + 1FDCAFC71A5F002B00012A37 /* libLLVMSparcDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104D1A57DEDF00970A48 /* libLLVMSparcDisassembler.a */; }; + 1FDCAFC81A5F002B00012A37 /* libLLVMSparcInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104E1A57DEDF00970A48 /* libLLVMSparcInfo.a */; }; + 1FDCAFC91A5F002B00012A37 /* libLLVMSupport.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26104F1A57DEDF00970A48 /* libLLVMSupport.a */; }; + 1FDCAFCA1A5F002B00012A37 /* libLLVMSystemZAsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610501A57DEDF00970A48 /* libLLVMSystemZAsmParser.a */; }; + 1FDCAFCB1A5F002B00012A37 /* libLLVMSystemZAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610511A57DEDF00970A48 /* libLLVMSystemZAsmPrinter.a */; }; + 1FDCAFCC1A5F002B00012A37 /* libLLVMSystemZCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610521A57DEDF00970A48 /* libLLVMSystemZCodeGen.a */; }; + 1FDCAFCD1A5F002B00012A37 /* libLLVMSystemZDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610531A57DEDF00970A48 /* libLLVMSystemZDesc.a */; }; + 1FDCAFCE1A5F002B00012A37 /* libLLVMSystemZDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610541A57DEDF00970A48 /* libLLVMSystemZDisassembler.a */; }; + 1FDCAFCF1A5F002B00012A37 /* libLLVMSystemZInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610551A57DEDF00970A48 /* libLLVMSystemZInfo.a */; }; + 1FDCAFD01A5F002B00012A37 /* libLLVMTableGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610561A57DEDF00970A48 /* libLLVMTableGen.a */; }; + 1FDCAFD11A5F002B00012A37 /* libLLVMTarget.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610571A57DEDF00970A48 /* libLLVMTarget.a */; }; + 1FDCAFD21A5F002B00012A37 /* libLLVMTransformUtils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610581A57DEDF00970A48 /* libLLVMTransformUtils.a */; }; + 1FDCAFD31A5F002B00012A37 /* libLLVMVectorize.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610591A57DEDF00970A48 /* libLLVMVectorize.a */; }; + 1FDCAFD41A5F002B00012A37 /* libLLVMX86AsmParser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105A1A57DEDF00970A48 /* libLLVMX86AsmParser.a */; }; + 1FDCAFD51A5F002B00012A37 /* libLLVMX86AsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105B1A57DEDF00970A48 /* libLLVMX86AsmPrinter.a */; }; + 1FDCAFD61A5F002B00012A37 /* libLLVMX86CodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105C1A57DEDF00970A48 /* libLLVMX86CodeGen.a */; }; + 1FDCAFD71A5F002B00012A37 /* libLLVMX86Desc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105D1A57DEDF00970A48 /* libLLVMX86Desc.a */; }; + 1FDCAFD81A5F002B00012A37 /* libLLVMX86Disassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105E1A57DEDF00970A48 /* libLLVMX86Disassembler.a */; }; + 1FDCAFD91A5F002B00012A37 /* libLLVMX86Info.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F26105F1A57DEDF00970A48 /* libLLVMX86Info.a */; }; + 1FDCAFDA1A5F002B00012A37 /* libLLVMX86Utils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610601A57DEDF00970A48 /* libLLVMX86Utils.a */; }; + 1FDCAFDB1A5F002B00012A37 /* libLLVMXCoreAsmPrinter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610611A57DEDF00970A48 /* libLLVMXCoreAsmPrinter.a */; }; + 1FDCAFDC1A5F002B00012A37 /* libLLVMXCoreCodeGen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610621A57DEDF00970A48 /* libLLVMXCoreCodeGen.a */; }; + 1FDCAFDD1A5F002B00012A37 /* libLLVMXCoreDesc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610631A57DEDF00970A48 /* libLLVMXCoreDesc.a */; }; + 1FDCAFDE1A5F002B00012A37 /* libLLVMXCoreDisassembler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610641A57DEDF00970A48 /* libLLVMXCoreDisassembler.a */; }; + 1FDCAFDF1A5F002B00012A37 /* libLLVMXCoreInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F2610651A57DEDF00970A48 /* libLLVMXCoreInfo.a */; }; + 1FDCAFE61A5F007E00012A37 /* libclangAnalysis.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FDD1A57DEDF00970A48 /* libclangAnalysis.a */; }; + 1FDCAFE71A5F007E00012A37 /* libclangARCMigrate.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F260FDF1A57DEDF00970A48 /* libclangARCMigrate.a */; }; + 1FDD0F071A5A79A80035D578 /* Rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FDD0F061A5A79A80035D578 /* Rewriter.cpp */; }; + 1FF678AC1A5BCB1D004F54DA /* compound_stmt_rewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FF678AA1A5BCB1D004F54DA /* compound_stmt_rewriter.cpp */; }; + 1FF678B11A5CC19B004F54DA /* Fling in Copy Binary Files */ = {isa = PBXBuildFile; fileRef = 1FF678AF1A5C8E10004F54DA /* Fling */; }; + 1FF6791E1A5CC7B6004F54DA /* FlexLexer.h in Copy C++ Headers */ = {isa = PBXBuildFile; fileRef = 1FF6791C1A5CC788004F54DA /* FlexLexer.h */; }; + 1FF679211A5CC7EC004F54DA /* sanitizer in Copy Clang Header */ = {isa = PBXBuildFile; fileRef = 1FF679201A5CC7E6004F54DA /* sanitizer */; }; + 1FF679221A5CC7F3004F54DA /* c++ in Copy C++ Headers */ = {isa = PBXBuildFile; fileRef = 1FF6791F1A5CC7D4004F54DA /* c++ */; }; + 1FF679251A5D6280004F54DA /* helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FF679231A5D6280004F54DA /* helpers.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1F23F8C61A5EF22900C8AD07 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1F9A97EC1A49550000C3BB26 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1F97E2ED1A55E75A00CE7EA4; + remoteInfo = Foxling; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1F23F8D51A5EF26100C8AD07 /* Copy Executables */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + 1F23F8D61A5EF26B00C8AD07 /* Foxling Compiler in Copy Executables */, + 1F23F8D71A5EF39800C8AD07 /* Foxling in Copy Executables */, + 1F23F8D81A5EF3BD00C8AD07 /* Fling in Copy Executables */, + 1F23F8D91A5EF3BD00C8AD07 /* Fling++ in Copy Executables */, + ); + name = "Copy Executables"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1F23F8DA1A5EF3E500C8AD07 /* Copy Clang Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ../lib/clang/3.6.0/include; + dstSubfolderSpec = 7; + files = ( + 1F23F8DB1A5EF41000C8AD07 /* __wmmintrin_aes.h in Copy Clang Headers */, + 1F23F8DC1A5EF41000C8AD07 /* __wmmintrin_pclmul.h in Copy Clang Headers */, + 1F23F8DD1A5EF41000C8AD07 /* altivec.h in Copy Clang Headers */, + 1F23F8DE1A5EF41000C8AD07 /* ammintrin.h in Copy Clang Headers */, + 1F23F8DF1A5EF41000C8AD07 /* arm64_neon_internal.h in Copy Clang Headers */, + 1F23F8E01A5EF41000C8AD07 /* arm_neon.h in Copy Clang Headers */, + 1F23F8E11A5EF41000C8AD07 /* avx2intrin.h in Copy Clang Headers */, + 1F23F8E21A5EF41000C8AD07 /* avxintrin.h in Copy Clang Headers */, + 1F23F8E31A5EF41000C8AD07 /* bmi2intrin.h in Copy Clang Headers */, + 1F23F8E41A5EF41000C8AD07 /* bmiintrin.h in Copy Clang Headers */, + 1F23F8E51A5EF41000C8AD07 /* cpuid.h in Copy Clang Headers */, + 1F23F8E61A5EF41000C8AD07 /* emmintrin.h in Copy Clang Headers */, + 1F23F8E71A5EF41000C8AD07 /* f16cintrin.h in Copy Clang Headers */, + 1F23F8E81A5EF41000C8AD07 /* float.h in Copy Clang Headers */, + 1F23F8E91A5EF41000C8AD07 /* sanitizer in Copy Clang Headers */, + 1F23F8EA1A5EF41000C8AD07 /* fma4intrin.h in Copy Clang Headers */, + 1F23F8EB1A5EF41000C8AD07 /* fmaintrin.h in Copy Clang Headers */, + 1F23F8EC1A5EF41000C8AD07 /* immintrin.h in Copy Clang Headers */, + 1F23F8ED1A5EF41000C8AD07 /* Intrin.h in Copy Clang Headers */, + 1F23F8EE1A5EF41000C8AD07 /* iso646.h in Copy Clang Headers */, + 1F23F8EF1A5EF41000C8AD07 /* limits.h in Copy Clang Headers */, + 1F23F8F01A5EF41000C8AD07 /* lzcntintrin.h in Copy Clang Headers */, + 1F23F8F11A5EF41000C8AD07 /* mm3dnow.h in Copy Clang Headers */, + 1F23F8F21A5EF41000C8AD07 /* mm_malloc.h in Copy Clang Headers */, + 1F23F8F31A5EF41000C8AD07 /* mmintrin.h in Copy Clang Headers */, + 1F23F8F41A5EF41000C8AD07 /* module.map in Copy Clang Headers */, + 1F23F8F51A5EF41000C8AD07 /* nmmintrin.h in Copy Clang Headers */, + 1F23F8F61A5EF41000C8AD07 /* pmmintrin.h in Copy Clang Headers */, + 1F23F8F71A5EF41000C8AD07 /* popcntintrin.h in Copy Clang Headers */, + 1F23F8F81A5EF41000C8AD07 /* prfchwintrin.h in Copy Clang Headers */, + 1F23F8F91A5EF41000C8AD07 /* rdseedintrin.h in Copy Clang Headers */, + 1F23F8FA1A5EF41000C8AD07 /* rtmintrin.h in Copy Clang Headers */, + 1F23F8FB1A5EF41000C8AD07 /* shaintrin.h in Copy Clang Headers */, + 1F23F8FC1A5EF41000C8AD07 /* smmintrin.h in Copy Clang Headers */, + 1F23F8FD1A5EF41000C8AD07 /* stdalign.h in Copy Clang Headers */, + 1F23F8FE1A5EF41000C8AD07 /* stdarg.h in Copy Clang Headers */, + 1F23F8FF1A5EF41000C8AD07 /* stdbool.h in Copy Clang Headers */, + 1F23F9001A5EF41000C8AD07 /* stddef.h in Copy Clang Headers */, + 1F23F9011A5EF41000C8AD07 /* stdint.h in Copy Clang Headers */, + 1F23F9021A5EF41000C8AD07 /* stdnoreturn.h in Copy Clang Headers */, + 1F23F9031A5EF41000C8AD07 /* tbmintrin.h in Copy Clang Headers */, + 1F23F9041A5EF41000C8AD07 /* tgmath.h in Copy Clang Headers */, + 1F23F9051A5EF41000C8AD07 /* tmmintrin.h in Copy Clang Headers */, + 1F23F9061A5EF41000C8AD07 /* unwind.h in Copy Clang Headers */, + 1F23F9071A5EF41000C8AD07 /* varargs.h in Copy Clang Headers */, + 1F23F9081A5EF41000C8AD07 /* wmmintrin.h in Copy Clang Headers */, + 1F23F9091A5EF41000C8AD07 /* x86intrin.h in Copy Clang Headers */, + 1F23F90A1A5EF41000C8AD07 /* xmmintrin.h in Copy Clang Headers */, + 1F23F90B1A5EF41000C8AD07 /* xopintrin.h in Copy Clang Headers */, + ); + name = "Copy Clang Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1F23F90C1A5EF41500C8AD07 /* Copy C++ Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ../include; + dstSubfolderSpec = 7; + files = ( + 1F23F90D1A5EF42B00C8AD07 /* c++ in Copy C++ Headers */, + 1F23F90E1A5EF42B00C8AD07 /* FlexLexer.h in Copy C++ Headers */, + ); + name = "Copy C++ Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1F97E2EC1A55E75A00CE7EA4 /* Copy Clang Header */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ../lib/clang/3.6.0/include; + dstSubfolderSpec = 16; + files = ( + 1FF679211A5CC7EC004F54DA /* sanitizer in Copy Clang Header */, + 1F2611991A57ED0200970A48 /* __wmmintrin_aes.h in Copy Clang Header */, + 1F26119A1A57ED0200970A48 /* __wmmintrin_pclmul.h in Copy Clang Header */, + 1F26119B1A57ED0200970A48 /* altivec.h in Copy Clang Header */, + 1F26119C1A57ED0200970A48 /* ammintrin.h in Copy Clang Header */, + 1F26119D1A57ED0200970A48 /* arm64_neon_internal.h in Copy Clang Header */, + 1F26119E1A57ED0200970A48 /* arm_neon.h in Copy Clang Header */, + 1F26119F1A57ED0200970A48 /* avx2intrin.h in Copy Clang Header */, + 1F2611A01A57ED0200970A48 /* avxintrin.h in Copy Clang Header */, + 1F2611A11A57ED0200970A48 /* bmi2intrin.h in Copy Clang Header */, + 1F2611A21A57ED0200970A48 /* bmiintrin.h in Copy Clang Header */, + 1F2611A31A57ED0200970A48 /* cpuid.h in Copy Clang Header */, + 1F2611A41A57ED0200970A48 /* emmintrin.h in Copy Clang Header */, + 1F2611A51A57ED0200970A48 /* f16cintrin.h in Copy Clang Header */, + 1F2611A61A57ED0200970A48 /* float.h in Copy Clang Header */, + 1F2611A71A57ED0200970A48 /* fma4intrin.h in Copy Clang Header */, + 1F2611A81A57ED0200970A48 /* fmaintrin.h in Copy Clang Header */, + 1F2611A91A57ED0200970A48 /* immintrin.h in Copy Clang Header */, + 1F2611AA1A57ED0200970A48 /* Intrin.h in Copy Clang Header */, + 1F2611AB1A57ED0200970A48 /* iso646.h in Copy Clang Header */, + 1F2611AC1A57ED0200970A48 /* limits.h in Copy Clang Header */, + 1F2611AD1A57ED0200970A48 /* lzcntintrin.h in Copy Clang Header */, + 1F2611AE1A57ED0200970A48 /* mm3dnow.h in Copy Clang Header */, + 1F2611AF1A57ED0200970A48 /* mm_malloc.h in Copy Clang Header */, + 1F2611B01A57ED0200970A48 /* mmintrin.h in Copy Clang Header */, + 1F2611B11A57ED0200970A48 /* module.map in Copy Clang Header */, + 1F2611B21A57ED0200970A48 /* nmmintrin.h in Copy Clang Header */, + 1F2611B31A57ED0200970A48 /* pmmintrin.h in Copy Clang Header */, + 1F2611B41A57ED0200970A48 /* popcntintrin.h in Copy Clang Header */, + 1F2611B51A57ED0200970A48 /* prfchwintrin.h in Copy Clang Header */, + 1F2611B61A57ED0200970A48 /* rdseedintrin.h in Copy Clang Header */, + 1F2611B71A57ED0200970A48 /* rtmintrin.h in Copy Clang Header */, + 1F2611BF1A57ED0200970A48 /* shaintrin.h in Copy Clang Header */, + 1F2611C01A57ED0200970A48 /* smmintrin.h in Copy Clang Header */, + 1F2611C11A57ED0200970A48 /* stdalign.h in Copy Clang Header */, + 1F2611C21A57ED0200970A48 /* stdarg.h in Copy Clang Header */, + 1F2611C31A57ED0300970A48 /* stdbool.h in Copy Clang Header */, + 1F2611C41A57ED0300970A48 /* stddef.h in Copy Clang Header */, + 1F2611C51A57ED0300970A48 /* stdint.h in Copy Clang Header */, + 1F2611C61A57ED0300970A48 /* stdnoreturn.h in Copy Clang Header */, + 1F2611C71A57ED0300970A48 /* tbmintrin.h in Copy Clang Header */, + 1F2611C81A57ED0300970A48 /* tgmath.h in Copy Clang Header */, + 1F2611C91A57ED0300970A48 /* tmmintrin.h in Copy Clang Header */, + 1F2611CA1A57ED0300970A48 /* unwind.h in Copy Clang Header */, + 1F2611CB1A57ED0300970A48 /* varargs.h in Copy Clang Header */, + 1F2611CC1A57ED0300970A48 /* wmmintrin.h in Copy Clang Header */, + 1F2611CD1A57ED0300970A48 /* x86intrin.h in Copy Clang Header */, + 1F2611CE1A57ED0300970A48 /* xmmintrin.h in Copy Clang Header */, + 1F2611CF1A57ED0300970A48 /* xopintrin.h in Copy Clang Header */, + ); + name = "Copy Clang Header"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1FF678B01A5CC195004F54DA /* Copy Binary Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + 1FF678B11A5CC19B004F54DA /* Fling in Copy Binary Files */, + 1FAB84B91A5EEAAA00F9BF07 /* Fling++ in Copy Binary Files */, + ); + name = "Copy Binary Files"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1FF6791D1A5CC79A004F54DA /* Copy C++ Headers */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ../include; + dstSubfolderSpec = 16; + files = ( + 1FF6791E1A5CC7B6004F54DA /* FlexLexer.h in Copy C++ Headers */, + 1FF679221A5CC7F3004F54DA /* c++ in Copy C++ Headers */, + ); + name = "Copy C++ Headers"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1F23F8281A5EF0B200C8AD07 /* Foxling Compiler.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Foxling Compiler.xcplugin"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1F23F82B1A5EF0B200C8AD07 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1F23F8C81A5EF24B00C8AD07 /* Foxling Compiler */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.bundle"; path = "Foxling Compiler"; sourceTree = ""; }; + 1F260FDC1A57DEDF00970A48 /* libc++abi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libc++abi.a"; path = "../../llvm/llvm_build/lib/libc++abi.a"; sourceTree = ""; }; + 1F260FDD1A57DEDF00970A48 /* libclangAnalysis.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangAnalysis.a; path = ../../llvm/llvm_build/lib/libclangAnalysis.a; sourceTree = ""; }; + 1F260FDE1A57DEDF00970A48 /* libclangApplyReplacements.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangApplyReplacements.a; path = ../../llvm/llvm_build/lib/libclangApplyReplacements.a; sourceTree = ""; }; + 1F260FDF1A57DEDF00970A48 /* libclangARCMigrate.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangARCMigrate.a; path = ../../llvm/llvm_build/lib/libclangARCMigrate.a; sourceTree = ""; }; + 1F260FE01A57DEDF00970A48 /* libclangAST.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangAST.a; path = ../../llvm/llvm_build/lib/libclangAST.a; sourceTree = ""; }; + 1F260FE11A57DEDF00970A48 /* libclangASTMatchers.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangASTMatchers.a; path = ../../llvm/llvm_build/lib/libclangASTMatchers.a; sourceTree = ""; }; + 1F260FE21A57DEDF00970A48 /* libclangBasic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangBasic.a; path = ../../llvm/llvm_build/lib/libclangBasic.a; sourceTree = ""; }; + 1F260FE31A57DEDF00970A48 /* libclangCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangCodeGen.a; path = ../../llvm/llvm_build/lib/libclangCodeGen.a; sourceTree = ""; }; + 1F260FE41A57DEDF00970A48 /* libclangDriver.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangDriver.a; path = ../../llvm/llvm_build/lib/libclangDriver.a; sourceTree = ""; }; + 1F260FE51A57DEDF00970A48 /* libclangDynamicASTMatchers.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangDynamicASTMatchers.a; path = ../../llvm/llvm_build/lib/libclangDynamicASTMatchers.a; sourceTree = ""; }; + 1F260FE61A57DEDF00970A48 /* libclangEdit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangEdit.a; path = ../../llvm/llvm_build/lib/libclangEdit.a; sourceTree = ""; }; + 1F260FE71A57DEDF00970A48 /* libclangFormat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangFormat.a; path = ../../llvm/llvm_build/lib/libclangFormat.a; sourceTree = ""; }; + 1F260FE81A57DEDF00970A48 /* libclangFrontend.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangFrontend.a; path = ../../llvm/llvm_build/lib/libclangFrontend.a; sourceTree = ""; }; + 1F260FE91A57DEDF00970A48 /* libclangFrontendTool.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangFrontendTool.a; path = ../../llvm/llvm_build/lib/libclangFrontendTool.a; sourceTree = ""; }; + 1F260FEA1A57DEDF00970A48 /* libclangIndex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangIndex.a; path = ../../llvm/llvm_build/lib/libclangIndex.a; sourceTree = ""; }; + 1F260FEB1A57DEDF00970A48 /* libclangLex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangLex.a; path = ../../llvm/llvm_build/lib/libclangLex.a; sourceTree = ""; }; + 1F260FEC1A57DEDF00970A48 /* libclangParse.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangParse.a; path = ../../llvm/llvm_build/lib/libclangParse.a; sourceTree = ""; }; + 1F260FED1A57DEDF00970A48 /* libclangQuery.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangQuery.a; path = ../../llvm/llvm_build/lib/libclangQuery.a; sourceTree = ""; }; + 1F260FEE1A57DEDF00970A48 /* libclangRename.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangRename.a; path = ../../llvm/llvm_build/lib/libclangRename.a; sourceTree = ""; }; + 1F260FEF1A57DEDF00970A48 /* libclangRewrite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangRewrite.a; path = ../../llvm/llvm_build/lib/libclangRewrite.a; sourceTree = ""; }; + 1F260FF01A57DEDF00970A48 /* libclangRewriteFrontend.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangRewriteFrontend.a; path = ../../llvm/llvm_build/lib/libclangRewriteFrontend.a; sourceTree = ""; }; + 1F260FF11A57DEDF00970A48 /* libclangSema.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangSema.a; path = ../../llvm/llvm_build/lib/libclangSema.a; sourceTree = ""; }; + 1F260FF21A57DEDF00970A48 /* libclangSerialization.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangSerialization.a; path = ../../llvm/llvm_build/lib/libclangSerialization.a; sourceTree = ""; }; + 1F260FF31A57DEDF00970A48 /* libclangStaticAnalyzerCheckers.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangStaticAnalyzerCheckers.a; path = ../../llvm/llvm_build/lib/libclangStaticAnalyzerCheckers.a; sourceTree = ""; }; + 1F260FF41A57DEDF00970A48 /* libclangStaticAnalyzerCore.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangStaticAnalyzerCore.a; path = ../../llvm/llvm_build/lib/libclangStaticAnalyzerCore.a; sourceTree = ""; }; + 1F260FF51A57DEDF00970A48 /* libclangStaticAnalyzerFrontend.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangStaticAnalyzerFrontend.a; path = ../../llvm/llvm_build/lib/libclangStaticAnalyzerFrontend.a; sourceTree = ""; }; + 1F260FFC1A57DEDF00970A48 /* libclangTooling.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangTooling.a; path = ../../llvm/llvm_build/lib/libclangTooling.a; sourceTree = ""; }; + 1F260FFD1A57DEDF00970A48 /* libclangToolingCore.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libclangToolingCore.a; path = ../../llvm/llvm_build/lib/libclangToolingCore.a; sourceTree = ""; }; + 1F2610001A57DEDF00970A48 /* libLLVMAArch64AsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64AsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64AsmParser.a; sourceTree = ""; }; + 1F2610011A57DEDF00970A48 /* libLLVMAArch64AsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64AsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64AsmPrinter.a; sourceTree = ""; }; + 1F2610021A57DEDF00970A48 /* libLLVMAArch64CodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64CodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64CodeGen.a; sourceTree = ""; }; + 1F2610031A57DEDF00970A48 /* libLLVMAArch64Desc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64Desc.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64Desc.a; sourceTree = ""; }; + 1F2610041A57DEDF00970A48 /* libLLVMAArch64Disassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64Disassembler.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64Disassembler.a; sourceTree = ""; }; + 1F2610051A57DEDF00970A48 /* libLLVMAArch64Info.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64Info.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64Info.a; sourceTree = ""; }; + 1F2610061A57DEDF00970A48 /* libLLVMAArch64Utils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAArch64Utils.a; path = ../../llvm/llvm_build/lib/libLLVMAArch64Utils.a; sourceTree = ""; }; + 1F2610071A57DEDF00970A48 /* libLLVMAnalysis.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAnalysis.a; path = ../../llvm/llvm_build/lib/libLLVMAnalysis.a; sourceTree = ""; }; + 1F2610081A57DEDF00970A48 /* libLLVMARMAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMARMAsmParser.a; sourceTree = ""; }; + 1F2610091A57DEDF00970A48 /* libLLVMARMAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMARMAsmPrinter.a; sourceTree = ""; }; + 1F26100A1A57DEDF00970A48 /* libLLVMARMCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMARMCodeGen.a; sourceTree = ""; }; + 1F26100B1A57DEDF00970A48 /* libLLVMARMDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMDesc.a; path = ../../llvm/llvm_build/lib/libLLVMARMDesc.a; sourceTree = ""; }; + 1F26100C1A57DEDF00970A48 /* libLLVMARMDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMARMDisassembler.a; sourceTree = ""; }; + 1F26100D1A57DEDF00970A48 /* libLLVMARMInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMARMInfo.a; path = ../../llvm/llvm_build/lib/libLLVMARMInfo.a; sourceTree = ""; }; + 1F26100E1A57DEDF00970A48 /* libLLVMAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMAsmParser.a; sourceTree = ""; }; + 1F26100F1A57DEDF00970A48 /* libLLVMAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMAsmPrinter.a; sourceTree = ""; }; + 1F2610101A57DEDF00970A48 /* libLLVMBitReader.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMBitReader.a; path = ../../llvm/llvm_build/lib/libLLVMBitReader.a; sourceTree = ""; }; + 1F2610111A57DEDF00970A48 /* libLLVMBitWriter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMBitWriter.a; path = ../../llvm/llvm_build/lib/libLLVMBitWriter.a; sourceTree = ""; }; + 1F2610121A57DEDF00970A48 /* libLLVMCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMCodeGen.a; sourceTree = ""; }; + 1F2610131A57DEDF00970A48 /* libLLVMCore.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMCore.a; path = ../../llvm/llvm_build/lib/libLLVMCore.a; sourceTree = ""; }; + 1F2610141A57DEDF00970A48 /* libLLVMCppBackendCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMCppBackendCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMCppBackendCodeGen.a; sourceTree = ""; }; + 1F2610151A57DEDF00970A48 /* libLLVMCppBackendInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMCppBackendInfo.a; path = ../../llvm/llvm_build/lib/libLLVMCppBackendInfo.a; sourceTree = ""; }; + 1F2610161A57DEDF00970A48 /* libLLVMDebugInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMDebugInfo.a; path = ../../llvm/llvm_build/lib/libLLVMDebugInfo.a; sourceTree = ""; }; + 1F2610171A57DEDF00970A48 /* libLLVMExecutionEngine.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMExecutionEngine.a; path = ../../llvm/llvm_build/lib/libLLVMExecutionEngine.a; sourceTree = ""; }; + 1F2610181A57DEDF00970A48 /* libLLVMHexagonCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMHexagonCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMHexagonCodeGen.a; sourceTree = ""; }; + 1F2610191A57DEDF00970A48 /* libLLVMHexagonDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMHexagonDesc.a; path = ../../llvm/llvm_build/lib/libLLVMHexagonDesc.a; sourceTree = ""; }; + 1F26101A1A57DEDF00970A48 /* libLLVMHexagonDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMHexagonDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMHexagonDisassembler.a; sourceTree = ""; }; + 1F26101B1A57DEDF00970A48 /* libLLVMHexagonInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMHexagonInfo.a; path = ../../llvm/llvm_build/lib/libLLVMHexagonInfo.a; sourceTree = ""; }; + 1F26101C1A57DEDF00970A48 /* libLLVMInstCombine.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMInstCombine.a; path = ../../llvm/llvm_build/lib/libLLVMInstCombine.a; sourceTree = ""; }; + 1F26101D1A57DEDF00970A48 /* libLLVMInstrumentation.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMInstrumentation.a; path = ../../llvm/llvm_build/lib/libLLVMInstrumentation.a; sourceTree = ""; }; + 1F26101E1A57DEDF00970A48 /* libLLVMInterpreter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMInterpreter.a; path = ../../llvm/llvm_build/lib/libLLVMInterpreter.a; sourceTree = ""; }; + 1F26101F1A57DEDF00970A48 /* libLLVMipa.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMipa.a; path = ../../llvm/llvm_build/lib/libLLVMipa.a; sourceTree = ""; }; + 1F2610201A57DEDF00970A48 /* libLLVMipo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMipo.a; path = ../../llvm/llvm_build/lib/libLLVMipo.a; sourceTree = ""; }; + 1F2610211A57DEDF00970A48 /* libLLVMIRReader.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMIRReader.a; path = ../../llvm/llvm_build/lib/libLLVMIRReader.a; sourceTree = ""; }; + 1F2610221A57DEDF00970A48 /* libLLVMLineEditor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMLineEditor.a; path = ../../llvm/llvm_build/lib/libLLVMLineEditor.a; sourceTree = ""; }; + 1F2610231A57DEDF00970A48 /* libLLVMLinker.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMLinker.a; path = ../../llvm/llvm_build/lib/libLLVMLinker.a; sourceTree = ""; }; + 1F2610241A57DEDF00970A48 /* libLLVMLTO.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMLTO.a; path = ../../llvm/llvm_build/lib/libLLVMLTO.a; sourceTree = ""; }; + 1F2610251A57DEDF00970A48 /* libLLVMMC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMC.a; path = ../../llvm/llvm_build/lib/libLLVMMC.a; sourceTree = ""; }; + 1F2610261A57DEDF00970A48 /* libLLVMMCDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMCDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMMCDisassembler.a; sourceTree = ""; }; + 1F2610271A57DEDF00970A48 /* libLLVMMCJIT.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMCJIT.a; path = ../../llvm/llvm_build/lib/libLLVMMCJIT.a; sourceTree = ""; }; + 1F2610281A57DEDF00970A48 /* libLLVMMCParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMCParser.a; path = ../../llvm/llvm_build/lib/libLLVMMCParser.a; sourceTree = ""; }; + 1F2610291A57DEDF00970A48 /* libLLVMMipsAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMMipsAsmParser.a; sourceTree = ""; }; + 1F26102A1A57DEDF00970A48 /* libLLVMMipsAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMMipsAsmPrinter.a; sourceTree = ""; }; + 1F26102B1A57DEDF00970A48 /* libLLVMMipsCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMMipsCodeGen.a; sourceTree = ""; }; + 1F26102C1A57DEDF00970A48 /* libLLVMMipsDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsDesc.a; path = ../../llvm/llvm_build/lib/libLLVMMipsDesc.a; sourceTree = ""; }; + 1F26102D1A57DEDF00970A48 /* libLLVMMipsDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMMipsDisassembler.a; sourceTree = ""; }; + 1F26102E1A57DEDF00970A48 /* libLLVMMipsInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMipsInfo.a; path = ../../llvm/llvm_build/lib/libLLVMMipsInfo.a; sourceTree = ""; }; + 1F26102F1A57DEDF00970A48 /* libLLVMMSP430AsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMSP430AsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMMSP430AsmPrinter.a; sourceTree = ""; }; + 1F2610301A57DEDF00970A48 /* libLLVMMSP430CodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMSP430CodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMMSP430CodeGen.a; sourceTree = ""; }; + 1F2610311A57DEDF00970A48 /* libLLVMMSP430Desc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMSP430Desc.a; path = ../../llvm/llvm_build/lib/libLLVMMSP430Desc.a; sourceTree = ""; }; + 1F2610321A57DEDF00970A48 /* libLLVMMSP430Info.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMMSP430Info.a; path = ../../llvm/llvm_build/lib/libLLVMMSP430Info.a; sourceTree = ""; }; + 1F2610331A57DEDF00970A48 /* libLLVMNVPTXAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMNVPTXAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMNVPTXAsmPrinter.a; sourceTree = ""; }; + 1F2610341A57DEDF00970A48 /* libLLVMNVPTXCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMNVPTXCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMNVPTXCodeGen.a; sourceTree = ""; }; + 1F2610351A57DEDF00970A48 /* libLLVMNVPTXDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMNVPTXDesc.a; path = ../../llvm/llvm_build/lib/libLLVMNVPTXDesc.a; sourceTree = ""; }; + 1F2610361A57DEDF00970A48 /* libLLVMNVPTXInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMNVPTXInfo.a; path = ../../llvm/llvm_build/lib/libLLVMNVPTXInfo.a; sourceTree = ""; }; + 1F2610371A57DEDF00970A48 /* libLLVMObjCARCOpts.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMObjCARCOpts.a; path = ../../llvm/llvm_build/lib/libLLVMObjCARCOpts.a; sourceTree = ""; }; + 1F2610381A57DEDF00970A48 /* libLLVMObject.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMObject.a; path = ../../llvm/llvm_build/lib/libLLVMObject.a; sourceTree = ""; }; + 1F2610391A57DEDF00970A48 /* libLLVMOption.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMOption.a; path = ../../llvm/llvm_build/lib/libLLVMOption.a; sourceTree = ""; }; + 1F26103A1A57DEDF00970A48 /* libLLVMPowerPCAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCAsmParser.a; sourceTree = ""; }; + 1F26103B1A57DEDF00970A48 /* libLLVMPowerPCAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCAsmPrinter.a; sourceTree = ""; }; + 1F26103C1A57DEDF00970A48 /* libLLVMPowerPCCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCCodeGen.a; sourceTree = ""; }; + 1F26103D1A57DEDF00970A48 /* libLLVMPowerPCDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCDesc.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCDesc.a; sourceTree = ""; }; + 1F26103E1A57DEDF00970A48 /* libLLVMPowerPCDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCDisassembler.a; sourceTree = ""; }; + 1F26103F1A57DEDF00970A48 /* libLLVMPowerPCInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMPowerPCInfo.a; path = ../../llvm/llvm_build/lib/libLLVMPowerPCInfo.a; sourceTree = ""; }; + 1F2610401A57DEDF00970A48 /* libLLVMProfileData.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMProfileData.a; path = ../../llvm/llvm_build/lib/libLLVMProfileData.a; sourceTree = ""; }; + 1F2610411A57DEDF00970A48 /* libLLVMR600AsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMR600AsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMR600AsmParser.a; sourceTree = ""; }; + 1F2610421A57DEDF00970A48 /* libLLVMR600AsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMR600AsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMR600AsmPrinter.a; sourceTree = ""; }; + 1F2610431A57DEDF00970A48 /* libLLVMR600CodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMR600CodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMR600CodeGen.a; sourceTree = ""; }; + 1F2610441A57DEDF00970A48 /* libLLVMR600Desc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMR600Desc.a; path = ../../llvm/llvm_build/lib/libLLVMR600Desc.a; sourceTree = ""; }; + 1F2610451A57DEDF00970A48 /* libLLVMR600Info.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMR600Info.a; path = ../../llvm/llvm_build/lib/libLLVMR600Info.a; sourceTree = ""; }; + 1F2610461A57DEDF00970A48 /* libLLVMRuntimeDyld.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMRuntimeDyld.a; path = ../../llvm/llvm_build/lib/libLLVMRuntimeDyld.a; sourceTree = ""; }; + 1F2610471A57DEDF00970A48 /* libLLVMScalarOpts.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMScalarOpts.a; path = ../../llvm/llvm_build/lib/libLLVMScalarOpts.a; sourceTree = ""; }; + 1F2610481A57DEDF00970A48 /* libLLVMSelectionDAG.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSelectionDAG.a; path = ../../llvm/llvm_build/lib/libLLVMSelectionDAG.a; sourceTree = ""; }; + 1F2610491A57DEDF00970A48 /* libLLVMSparcAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMSparcAsmParser.a; sourceTree = ""; }; + 1F26104A1A57DEDF00970A48 /* libLLVMSparcAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMSparcAsmPrinter.a; sourceTree = ""; }; + 1F26104B1A57DEDF00970A48 /* libLLVMSparcCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMSparcCodeGen.a; sourceTree = ""; }; + 1F26104C1A57DEDF00970A48 /* libLLVMSparcDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcDesc.a; path = ../../llvm/llvm_build/lib/libLLVMSparcDesc.a; sourceTree = ""; }; + 1F26104D1A57DEDF00970A48 /* libLLVMSparcDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMSparcDisassembler.a; sourceTree = ""; }; + 1F26104E1A57DEDF00970A48 /* libLLVMSparcInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSparcInfo.a; path = ../../llvm/llvm_build/lib/libLLVMSparcInfo.a; sourceTree = ""; }; + 1F26104F1A57DEDF00970A48 /* libLLVMSupport.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSupport.a; path = ../../llvm/llvm_build/lib/libLLVMSupport.a; sourceTree = ""; }; + 1F2610501A57DEDF00970A48 /* libLLVMSystemZAsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZAsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZAsmParser.a; sourceTree = ""; }; + 1F2610511A57DEDF00970A48 /* libLLVMSystemZAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZAsmPrinter.a; sourceTree = ""; }; + 1F2610521A57DEDF00970A48 /* libLLVMSystemZCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZCodeGen.a; sourceTree = ""; }; + 1F2610531A57DEDF00970A48 /* libLLVMSystemZDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZDesc.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZDesc.a; sourceTree = ""; }; + 1F2610541A57DEDF00970A48 /* libLLVMSystemZDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZDisassembler.a; sourceTree = ""; }; + 1F2610551A57DEDF00970A48 /* libLLVMSystemZInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMSystemZInfo.a; path = ../../llvm/llvm_build/lib/libLLVMSystemZInfo.a; sourceTree = ""; }; + 1F2610561A57DEDF00970A48 /* libLLVMTableGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMTableGen.a; path = ../../llvm/llvm_build/lib/libLLVMTableGen.a; sourceTree = ""; }; + 1F2610571A57DEDF00970A48 /* libLLVMTarget.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMTarget.a; path = ../../llvm/llvm_build/lib/libLLVMTarget.a; sourceTree = ""; }; + 1F2610581A57DEDF00970A48 /* libLLVMTransformUtils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMTransformUtils.a; path = ../../llvm/llvm_build/lib/libLLVMTransformUtils.a; sourceTree = ""; }; + 1F2610591A57DEDF00970A48 /* libLLVMVectorize.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMVectorize.a; path = ../../llvm/llvm_build/lib/libLLVMVectorize.a; sourceTree = ""; }; + 1F26105A1A57DEDF00970A48 /* libLLVMX86AsmParser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86AsmParser.a; path = ../../llvm/llvm_build/lib/libLLVMX86AsmParser.a; sourceTree = ""; }; + 1F26105B1A57DEDF00970A48 /* libLLVMX86AsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86AsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMX86AsmPrinter.a; sourceTree = ""; }; + 1F26105C1A57DEDF00970A48 /* libLLVMX86CodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86CodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMX86CodeGen.a; sourceTree = ""; }; + 1F26105D1A57DEDF00970A48 /* libLLVMX86Desc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86Desc.a; path = ../../llvm/llvm_build/lib/libLLVMX86Desc.a; sourceTree = ""; }; + 1F26105E1A57DEDF00970A48 /* libLLVMX86Disassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86Disassembler.a; path = ../../llvm/llvm_build/lib/libLLVMX86Disassembler.a; sourceTree = ""; }; + 1F26105F1A57DEDF00970A48 /* libLLVMX86Info.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86Info.a; path = ../../llvm/llvm_build/lib/libLLVMX86Info.a; sourceTree = ""; }; + 1F2610601A57DEDF00970A48 /* libLLVMX86Utils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMX86Utils.a; path = ../../llvm/llvm_build/lib/libLLVMX86Utils.a; sourceTree = ""; }; + 1F2610611A57DEDF00970A48 /* libLLVMXCoreAsmPrinter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMXCoreAsmPrinter.a; path = ../../llvm/llvm_build/lib/libLLVMXCoreAsmPrinter.a; sourceTree = ""; }; + 1F2610621A57DEDF00970A48 /* libLLVMXCoreCodeGen.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMXCoreCodeGen.a; path = ../../llvm/llvm_build/lib/libLLVMXCoreCodeGen.a; sourceTree = ""; }; + 1F2610631A57DEDF00970A48 /* libLLVMXCoreDesc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMXCoreDesc.a; path = ../../llvm/llvm_build/lib/libLLVMXCoreDesc.a; sourceTree = ""; }; + 1F2610641A57DEDF00970A48 /* libLLVMXCoreDisassembler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMXCoreDisassembler.a; path = ../../llvm/llvm_build/lib/libLLVMXCoreDisassembler.a; sourceTree = ""; }; + 1F2610651A57DEDF00970A48 /* libLLVMXCoreInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libLLVMXCoreInfo.a; path = ../../llvm/llvm_build/lib/libLLVMXCoreInfo.a; sourceTree = ""; }; + 1F2611611A57ECE900970A48 /* __wmmintrin_aes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = __wmmintrin_aes.h; sourceTree = ""; }; + 1F2611621A57ECE900970A48 /* __wmmintrin_pclmul.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = __wmmintrin_pclmul.h; sourceTree = ""; }; + 1F2611631A57ECE900970A48 /* altivec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = altivec.h; sourceTree = ""; }; + 1F2611641A57ECE900970A48 /* ammintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ammintrin.h; sourceTree = ""; }; + 1F2611651A57ECE900970A48 /* arm64_neon_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arm64_neon_internal.h; sourceTree = ""; }; + 1F2611661A57ECE900970A48 /* arm_neon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arm_neon.h; sourceTree = ""; }; + 1F2611671A57ECE900970A48 /* avx2intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = avx2intrin.h; sourceTree = ""; }; + 1F2611681A57ECE900970A48 /* avxintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = avxintrin.h; sourceTree = ""; }; + 1F2611691A57ECE900970A48 /* bmi2intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bmi2intrin.h; sourceTree = ""; }; + 1F26116A1A57ECE900970A48 /* bmiintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bmiintrin.h; sourceTree = ""; }; + 1F26116B1A57ECE900970A48 /* cpuid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cpuid.h; sourceTree = ""; }; + 1F26116C1A57ECE900970A48 /* emmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = emmintrin.h; sourceTree = ""; }; + 1F26116D1A57ECE900970A48 /* f16cintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = f16cintrin.h; sourceTree = ""; }; + 1F26116E1A57ECE900970A48 /* float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = float.h; sourceTree = ""; }; + 1F26116F1A57ECE900970A48 /* fma4intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fma4intrin.h; sourceTree = ""; }; + 1F2611701A57ECE900970A48 /* fmaintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fmaintrin.h; sourceTree = ""; }; + 1F2611711A57ECE900970A48 /* immintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = immintrin.h; sourceTree = ""; }; + 1F2611721A57ECE900970A48 /* Intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Intrin.h; sourceTree = ""; }; + 1F2611731A57ECE900970A48 /* iso646.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iso646.h; sourceTree = ""; }; + 1F2611741A57ECE900970A48 /* limits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = limits.h; sourceTree = ""; }; + 1F2611751A57ECE900970A48 /* lzcntintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lzcntintrin.h; sourceTree = ""; }; + 1F2611761A57ECE900970A48 /* mm3dnow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mm3dnow.h; sourceTree = ""; }; + 1F2611771A57ECE900970A48 /* mm_malloc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mm_malloc.h; sourceTree = ""; }; + 1F2611781A57ECE900970A48 /* mmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mmintrin.h; sourceTree = ""; }; + 1F2611791A57ECE900970A48 /* module.map */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.map; sourceTree = ""; }; + 1F26117A1A57ECE900970A48 /* nmmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nmmintrin.h; sourceTree = ""; }; + 1F26117B1A57ECE900970A48 /* pmmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pmmintrin.h; sourceTree = ""; }; + 1F26117C1A57ECE900970A48 /* popcntintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = popcntintrin.h; sourceTree = ""; }; + 1F26117D1A57ECE900970A48 /* prfchwintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = prfchwintrin.h; sourceTree = ""; }; + 1F26117E1A57ECE900970A48 /* rdseedintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rdseedintrin.h; sourceTree = ""; }; + 1F26117F1A57ECE900970A48 /* rtmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtmintrin.h; sourceTree = ""; }; + 1F2611881A57ECE900970A48 /* shaintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = shaintrin.h; sourceTree = ""; }; + 1F2611891A57ECE900970A48 /* smmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = smmintrin.h; sourceTree = ""; }; + 1F26118A1A57ECE900970A48 /* stdalign.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdalign.h; sourceTree = ""; }; + 1F26118B1A57ECE900970A48 /* stdarg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdarg.h; sourceTree = ""; }; + 1F26118C1A57ECE900970A48 /* stdbool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdbool.h; sourceTree = ""; }; + 1F26118D1A57ECE900970A48 /* stddef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stddef.h; sourceTree = ""; }; + 1F26118E1A57ECE900970A48 /* stdint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdint.h; sourceTree = ""; }; + 1F26118F1A57ECE900970A48 /* stdnoreturn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdnoreturn.h; sourceTree = ""; }; + 1F2611901A57ECE900970A48 /* tbmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tbmintrin.h; sourceTree = ""; }; + 1F2611911A57ECE900970A48 /* tgmath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tgmath.h; sourceTree = ""; }; + 1F2611921A57ECE900970A48 /* tmmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tmmintrin.h; sourceTree = ""; }; + 1F2611931A57ECE900970A48 /* unwind.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unwind.h; sourceTree = ""; }; + 1F2611941A57ECE900970A48 /* varargs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = varargs.h; sourceTree = ""; }; + 1F2611951A57ECE900970A48 /* wmmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wmmintrin.h; sourceTree = ""; }; + 1F2611961A57ECE900970A48 /* x86intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x86intrin.h; sourceTree = ""; }; + 1F2611971A57ECE900970A48 /* xmmintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xmmintrin.h; sourceTree = ""; }; + 1F2611981A57ECE900970A48 /* xopintrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xopintrin.h; sourceTree = ""; }; + 1F2611D11A58AC6E00970A48 /* objc_matchers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objc_matchers.h; sourceTree = ""; }; + 1F2611D41A58EEF600970A48 /* objc_property_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = objc_property_rewriter.cpp; sourceTree = ""; }; + 1F2611D51A58EEF600970A48 /* objc_property_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objc_property_rewriter.h; sourceTree = ""; }; + 1F2611D71A58F0C700970A48 /* objc_message_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = objc_message_rewriter.cpp; sourceTree = ""; }; + 1F2611D81A58F0C700970A48 /* objc_message_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objc_message_rewriter.h; sourceTree = ""; }; + 1F2611DA1A58F15800970A48 /* unary_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unary_rewriter.cpp; sourceTree = ""; }; + 1F2611DB1A58F15800970A48 /* unary_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unary_rewriter.h; sourceTree = ""; }; + 1F2611E01A58F2E500970A48 /* prefix_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prefix_rewriter.cpp; sourceTree = ""; }; + 1F2611E11A58F2E500970A48 /* prefix_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefix_rewriter.h; sourceTree = ""; }; + 1F2611E31A5A035300970A48 /* source_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = source_rewriter.cpp; sourceTree = ""; }; + 1F2611E41A5A035300970A48 /* source_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source_rewriter.h; sourceTree = ""; }; + 1F2836451A5EF96B00824B14 /* version.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = version.plist; sourceTree = ""; }; + 1F97E2E41A55061300CE7EA4 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 1F97E2E61A55062000CE7EA4 /* libcurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurses.dylib; path = usr/lib/libcurses.dylib; sourceTree = SDKROOT; }; + 1F97E2EE1A55E75A00CE7EA4 /* Foxling */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Foxling; sourceTree = BUILT_PRODUCTS_DIR; }; + 1F97E2F01A55E75A00CE7EA4 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 1FA0A34B1A5EF8CD006EA00C /* Default Compiler.xcspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xcspec; path = "Default Compiler.xcspec"; sourceTree = ""; }; + 1FA0A34C1A5EF8CD006EA00C /* English.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = English.lproj; sourceTree = ""; }; + 1FA0A34D1A5EF8CD006EA00C /* Foxling Compiler.xcspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xcspec; path = "Foxling Compiler.xcspec"; sourceTree = ""; }; + 1FAB84B81A5EEA2500F9BF07 /* Fling++ */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "Fling++"; sourceTree = ""; }; + 1FDCAFEB1A5F020900012A37 /* download_and_build.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = download_and_build.sh; sourceTree = ""; }; + 1FDD0F061A5A79A80035D578 /* Rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rewriter.cpp; sourceTree = ""; }; + 1FDD0F081A5A79C40035D578 /* Rewriter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Rewriter.h; sourceTree = ""; }; + 1FF678AA1A5BCB1D004F54DA /* compound_stmt_rewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compound_stmt_rewriter.cpp; sourceTree = ""; }; + 1FF678AB1A5BCB1D004F54DA /* compound_stmt_rewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compound_stmt_rewriter.h; sourceTree = ""; }; + 1FF678AF1A5C8E10004F54DA /* Fling */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = Fling; sourceTree = ""; }; + 1FF6791C1A5CC788004F54DA /* FlexLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FlexLexer.h; sourceTree = ""; }; + 1FF6791F1A5CC7D4004F54DA /* c++ */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "c++"; sourceTree = ""; }; + 1FF679201A5CC7E6004F54DA /* sanitizer */ = {isa = PBXFileReference; lastKnownFileType = folder; path = sanitizer; sourceTree = ""; }; + 1FF679231A5D6280004F54DA /* helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = helpers.cpp; sourceTree = ""; }; + 1FF679241A5D6280004F54DA /* helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helpers.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1F97E2EB1A55E75A00CE7EA4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F260FC51A566B1A00970A48 /* libcurses.dylib in Frameworks */, + 1F260FC41A566B0E00970A48 /* libz.dylib in Frameworks */, + 1F2610661A57DEDF00970A48 /* libc++abi.a in Frameworks */, + 1FDCAFE61A5F007E00012A37 /* libclangAnalysis.a in Frameworks */, + 1FDCAF581A5F002B00012A37 /* libclangApplyReplacements.a in Frameworks */, + 1FDCAFE71A5F007E00012A37 /* libclangARCMigrate.a in Frameworks */, + 1FDCAF5A1A5F002B00012A37 /* libclangAST.a in Frameworks */, + 1FDCAF5B1A5F002B00012A37 /* libclangASTMatchers.a in Frameworks */, + 1FDCAF5C1A5F002B00012A37 /* libclangBasic.a in Frameworks */, + 1FDCAF5D1A5F002B00012A37 /* libclangCodeGen.a in Frameworks */, + 1FDCAF5E1A5F002B00012A37 /* libclangDriver.a in Frameworks */, + 1FDCAF5F1A5F002B00012A37 /* libclangDynamicASTMatchers.a in Frameworks */, + 1FDCAF601A5F002B00012A37 /* libclangEdit.a in Frameworks */, + 1FDCAF611A5F002B00012A37 /* libclangFormat.a in Frameworks */, + 1FDCAF621A5F002B00012A37 /* libclangFrontend.a in Frameworks */, + 1FDCAF631A5F002B00012A37 /* libclangFrontendTool.a in Frameworks */, + 1FDCAF641A5F002B00012A37 /* libclangIndex.a in Frameworks */, + 1FDCAF651A5F002B00012A37 /* libclangLex.a in Frameworks */, + 1FDCAF661A5F002B00012A37 /* libclangParse.a in Frameworks */, + 1FDCAF671A5F002B00012A37 /* libclangQuery.a in Frameworks */, + 1FDCAF681A5F002B00012A37 /* libclangRename.a in Frameworks */, + 1FDCAF691A5F002B00012A37 /* libclangRewrite.a in Frameworks */, + 1FDCAF6A1A5F002B00012A37 /* libclangRewriteFrontend.a in Frameworks */, + 1FDCAF6B1A5F002B00012A37 /* libclangSema.a in Frameworks */, + 1FDCAF6C1A5F002B00012A37 /* libclangSerialization.a in Frameworks */, + 1FDCAF6D1A5F002B00012A37 /* libclangStaticAnalyzerCheckers.a in Frameworks */, + 1FDCAF6E1A5F002B00012A37 /* libclangStaticAnalyzerCore.a in Frameworks */, + 1FDCAF6F1A5F002B00012A37 /* libclangStaticAnalyzerFrontend.a in Frameworks */, + 1FDCAF761A5F002B00012A37 /* libclangTooling.a in Frameworks */, + 1FDCAF771A5F002B00012A37 /* libclangToolingCore.a in Frameworks */, + 1FDCAF7A1A5F002B00012A37 /* libLLVMAArch64AsmParser.a in Frameworks */, + 1FDCAF7B1A5F002B00012A37 /* libLLVMAArch64AsmPrinter.a in Frameworks */, + 1FDCAF7C1A5F002B00012A37 /* libLLVMAArch64CodeGen.a in Frameworks */, + 1FDCAF7D1A5F002B00012A37 /* libLLVMAArch64Desc.a in Frameworks */, + 1FDCAF7E1A5F002B00012A37 /* libLLVMAArch64Disassembler.a in Frameworks */, + 1FDCAF7F1A5F002B00012A37 /* libLLVMAArch64Info.a in Frameworks */, + 1FDCAF801A5F002B00012A37 /* libLLVMAArch64Utils.a in Frameworks */, + 1FDCAF811A5F002B00012A37 /* libLLVMAnalysis.a in Frameworks */, + 1FDCAF821A5F002B00012A37 /* libLLVMARMAsmParser.a in Frameworks */, + 1FDCAF831A5F002B00012A37 /* libLLVMARMAsmPrinter.a in Frameworks */, + 1FDCAF841A5F002B00012A37 /* libLLVMARMCodeGen.a in Frameworks */, + 1FDCAF851A5F002B00012A37 /* libLLVMARMDesc.a in Frameworks */, + 1FDCAF861A5F002B00012A37 /* libLLVMARMDisassembler.a in Frameworks */, + 1FDCAF871A5F002B00012A37 /* libLLVMARMInfo.a in Frameworks */, + 1FDCAF881A5F002B00012A37 /* libLLVMAsmParser.a in Frameworks */, + 1FDCAF891A5F002B00012A37 /* libLLVMAsmPrinter.a in Frameworks */, + 1FDCAF8A1A5F002B00012A37 /* libLLVMBitReader.a in Frameworks */, + 1FDCAF8B1A5F002B00012A37 /* libLLVMBitWriter.a in Frameworks */, + 1FDCAF8C1A5F002B00012A37 /* libLLVMCodeGen.a in Frameworks */, + 1FDCAF8D1A5F002B00012A37 /* libLLVMCore.a in Frameworks */, + 1FDCAF8E1A5F002B00012A37 /* libLLVMCppBackendCodeGen.a in Frameworks */, + 1FDCAF8F1A5F002B00012A37 /* libLLVMCppBackendInfo.a in Frameworks */, + 1FDCAF901A5F002B00012A37 /* libLLVMDebugInfo.a in Frameworks */, + 1FDCAF911A5F002B00012A37 /* libLLVMExecutionEngine.a in Frameworks */, + 1FDCAF921A5F002B00012A37 /* libLLVMHexagonCodeGen.a in Frameworks */, + 1FDCAF931A5F002B00012A37 /* libLLVMHexagonDesc.a in Frameworks */, + 1FDCAF941A5F002B00012A37 /* libLLVMHexagonDisassembler.a in Frameworks */, + 1FDCAF951A5F002B00012A37 /* libLLVMHexagonInfo.a in Frameworks */, + 1FDCAF961A5F002B00012A37 /* libLLVMInstCombine.a in Frameworks */, + 1FDCAF971A5F002B00012A37 /* libLLVMInstrumentation.a in Frameworks */, + 1FDCAF981A5F002B00012A37 /* libLLVMInterpreter.a in Frameworks */, + 1FDCAF991A5F002B00012A37 /* libLLVMipa.a in Frameworks */, + 1FDCAF9A1A5F002B00012A37 /* libLLVMipo.a in Frameworks */, + 1FDCAF9B1A5F002B00012A37 /* libLLVMIRReader.a in Frameworks */, + 1FDCAF9C1A5F002B00012A37 /* libLLVMLineEditor.a in Frameworks */, + 1FDCAF9D1A5F002B00012A37 /* libLLVMLinker.a in Frameworks */, + 1FDCAF9E1A5F002B00012A37 /* libLLVMLTO.a in Frameworks */, + 1FDCAF9F1A5F002B00012A37 /* libLLVMMC.a in Frameworks */, + 1FDCAFA01A5F002B00012A37 /* libLLVMMCDisassembler.a in Frameworks */, + 1FDCAFA11A5F002B00012A37 /* libLLVMMCJIT.a in Frameworks */, + 1FDCAFA21A5F002B00012A37 /* libLLVMMCParser.a in Frameworks */, + 1FDCAFA31A5F002B00012A37 /* libLLVMMipsAsmParser.a in Frameworks */, + 1FDCAFA41A5F002B00012A37 /* libLLVMMipsAsmPrinter.a in Frameworks */, + 1FDCAFA51A5F002B00012A37 /* libLLVMMipsCodeGen.a in Frameworks */, + 1FDCAFA61A5F002B00012A37 /* libLLVMMipsDesc.a in Frameworks */, + 1FDCAFA71A5F002B00012A37 /* libLLVMMipsDisassembler.a in Frameworks */, + 1FDCAFA81A5F002B00012A37 /* libLLVMMipsInfo.a in Frameworks */, + 1FDCAFA91A5F002B00012A37 /* libLLVMMSP430AsmPrinter.a in Frameworks */, + 1FDCAFAA1A5F002B00012A37 /* libLLVMMSP430CodeGen.a in Frameworks */, + 1FDCAFAB1A5F002B00012A37 /* libLLVMMSP430Desc.a in Frameworks */, + 1FDCAFAC1A5F002B00012A37 /* libLLVMMSP430Info.a in Frameworks */, + 1FDCAFAD1A5F002B00012A37 /* libLLVMNVPTXAsmPrinter.a in Frameworks */, + 1FDCAFAE1A5F002B00012A37 /* libLLVMNVPTXCodeGen.a in Frameworks */, + 1FDCAFAF1A5F002B00012A37 /* libLLVMNVPTXDesc.a in Frameworks */, + 1FDCAFB01A5F002B00012A37 /* libLLVMNVPTXInfo.a in Frameworks */, + 1FDCAFB11A5F002B00012A37 /* libLLVMObjCARCOpts.a in Frameworks */, + 1FDCAFB21A5F002B00012A37 /* libLLVMObject.a in Frameworks */, + 1FDCAFB31A5F002B00012A37 /* libLLVMOption.a in Frameworks */, + 1FDCAFB41A5F002B00012A37 /* libLLVMPowerPCAsmParser.a in Frameworks */, + 1FDCAFB51A5F002B00012A37 /* libLLVMPowerPCAsmPrinter.a in Frameworks */, + 1FDCAFB61A5F002B00012A37 /* libLLVMPowerPCCodeGen.a in Frameworks */, + 1FDCAFB71A5F002B00012A37 /* libLLVMPowerPCDesc.a in Frameworks */, + 1FDCAFB81A5F002B00012A37 /* libLLVMPowerPCDisassembler.a in Frameworks */, + 1FDCAFB91A5F002B00012A37 /* libLLVMPowerPCInfo.a in Frameworks */, + 1FDCAFBA1A5F002B00012A37 /* libLLVMProfileData.a in Frameworks */, + 1FDCAFBB1A5F002B00012A37 /* libLLVMR600AsmParser.a in Frameworks */, + 1FDCAFBC1A5F002B00012A37 /* libLLVMR600AsmPrinter.a in Frameworks */, + 1FDCAFBD1A5F002B00012A37 /* libLLVMR600CodeGen.a in Frameworks */, + 1FDCAFBE1A5F002B00012A37 /* libLLVMR600Desc.a in Frameworks */, + 1FDCAFBF1A5F002B00012A37 /* libLLVMR600Info.a in Frameworks */, + 1FDCAFC01A5F002B00012A37 /* libLLVMRuntimeDyld.a in Frameworks */, + 1FDCAFC11A5F002B00012A37 /* libLLVMScalarOpts.a in Frameworks */, + 1FDCAFC21A5F002B00012A37 /* libLLVMSelectionDAG.a in Frameworks */, + 1FDCAFC31A5F002B00012A37 /* libLLVMSparcAsmParser.a in Frameworks */, + 1FDCAFC41A5F002B00012A37 /* libLLVMSparcAsmPrinter.a in Frameworks */, + 1FDCAFC51A5F002B00012A37 /* libLLVMSparcCodeGen.a in Frameworks */, + 1FDCAFC61A5F002B00012A37 /* libLLVMSparcDesc.a in Frameworks */, + 1FDCAFC71A5F002B00012A37 /* libLLVMSparcDisassembler.a in Frameworks */, + 1FDCAFC81A5F002B00012A37 /* libLLVMSparcInfo.a in Frameworks */, + 1FDCAFC91A5F002B00012A37 /* libLLVMSupport.a in Frameworks */, + 1FDCAFCA1A5F002B00012A37 /* libLLVMSystemZAsmParser.a in Frameworks */, + 1FDCAFCB1A5F002B00012A37 /* libLLVMSystemZAsmPrinter.a in Frameworks */, + 1FDCAFCC1A5F002B00012A37 /* libLLVMSystemZCodeGen.a in Frameworks */, + 1FDCAFCD1A5F002B00012A37 /* libLLVMSystemZDesc.a in Frameworks */, + 1FDCAFCE1A5F002B00012A37 /* libLLVMSystemZDisassembler.a in Frameworks */, + 1FDCAFCF1A5F002B00012A37 /* libLLVMSystemZInfo.a in Frameworks */, + 1FDCAFD01A5F002B00012A37 /* libLLVMTableGen.a in Frameworks */, + 1FDCAFD11A5F002B00012A37 /* libLLVMTarget.a in Frameworks */, + 1FDCAFD21A5F002B00012A37 /* libLLVMTransformUtils.a in Frameworks */, + 1FDCAFD31A5F002B00012A37 /* libLLVMVectorize.a in Frameworks */, + 1FDCAFD41A5F002B00012A37 /* libLLVMX86AsmParser.a in Frameworks */, + 1FDCAFD51A5F002B00012A37 /* libLLVMX86AsmPrinter.a in Frameworks */, + 1FDCAFD61A5F002B00012A37 /* libLLVMX86CodeGen.a in Frameworks */, + 1FDCAFD71A5F002B00012A37 /* libLLVMX86Desc.a in Frameworks */, + 1FDCAFD81A5F002B00012A37 /* libLLVMX86Disassembler.a in Frameworks */, + 1FDCAFD91A5F002B00012A37 /* libLLVMX86Info.a in Frameworks */, + 1FDCAFDA1A5F002B00012A37 /* libLLVMX86Utils.a in Frameworks */, + 1FDCAFDB1A5F002B00012A37 /* libLLVMXCoreAsmPrinter.a in Frameworks */, + 1FDCAFDC1A5F002B00012A37 /* libLLVMXCoreCodeGen.a in Frameworks */, + 1FDCAFDD1A5F002B00012A37 /* libLLVMXCoreDesc.a in Frameworks */, + 1FDCAFDE1A5F002B00012A37 /* libLLVMXCoreDisassembler.a in Frameworks */, + 1FDCAFDF1A5F002B00012A37 /* libLLVMXCoreInfo.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1F23F8291A5EF0B200C8AD07 /* Foxling Compiler */ = { + isa = PBXGroup; + children = ( + 1F23F8C81A5EF24B00C8AD07 /* Foxling Compiler */, + 1F23F8CA1A5EF25A00C8AD07 /* Resources */, + 1F23F82A1A5EF0B200C8AD07 /* Supporting Files */, + ); + path = "Foxling Compiler"; + sourceTree = ""; + }; + 1F23F82A1A5EF0B200C8AD07 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 1F23F82B1A5EF0B200C8AD07 /* Info.plist */, + 1F2836451A5EF96B00824B14 /* version.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 1F23F8CA1A5EF25A00C8AD07 /* Resources */ = { + isa = PBXGroup; + children = ( + 1FA0A34B1A5EF8CD006EA00C /* Default Compiler.xcspec */, + 1FA0A34C1A5EF8CD006EA00C /* English.lproj */, + 1FA0A34D1A5EF8CD006EA00C /* Foxling Compiler.xcspec */, + ); + path = Resources; + sourceTree = ""; + }; + 1F2611601A57ECE900970A48 /* Clang Headers */ = { + isa = PBXGroup; + children = ( + 1F2611611A57ECE900970A48 /* __wmmintrin_aes.h */, + 1F2611621A57ECE900970A48 /* __wmmintrin_pclmul.h */, + 1F2611631A57ECE900970A48 /* altivec.h */, + 1F2611641A57ECE900970A48 /* ammintrin.h */, + 1F2611651A57ECE900970A48 /* arm64_neon_internal.h */, + 1F2611661A57ECE900970A48 /* arm_neon.h */, + 1F2611671A57ECE900970A48 /* avx2intrin.h */, + 1F2611681A57ECE900970A48 /* avxintrin.h */, + 1F2611691A57ECE900970A48 /* bmi2intrin.h */, + 1F26116A1A57ECE900970A48 /* bmiintrin.h */, + 1F26116B1A57ECE900970A48 /* cpuid.h */, + 1F26116C1A57ECE900970A48 /* emmintrin.h */, + 1F26116D1A57ECE900970A48 /* f16cintrin.h */, + 1F26116E1A57ECE900970A48 /* float.h */, + 1FF679201A5CC7E6004F54DA /* sanitizer */, + 1F26116F1A57ECE900970A48 /* fma4intrin.h */, + 1F2611701A57ECE900970A48 /* fmaintrin.h */, + 1F2611711A57ECE900970A48 /* immintrin.h */, + 1F2611721A57ECE900970A48 /* Intrin.h */, + 1F2611731A57ECE900970A48 /* iso646.h */, + 1F2611741A57ECE900970A48 /* limits.h */, + 1F2611751A57ECE900970A48 /* lzcntintrin.h */, + 1F2611761A57ECE900970A48 /* mm3dnow.h */, + 1F2611771A57ECE900970A48 /* mm_malloc.h */, + 1F2611781A57ECE900970A48 /* mmintrin.h */, + 1F2611791A57ECE900970A48 /* module.map */, + 1F26117A1A57ECE900970A48 /* nmmintrin.h */, + 1F26117B1A57ECE900970A48 /* pmmintrin.h */, + 1F26117C1A57ECE900970A48 /* popcntintrin.h */, + 1F26117D1A57ECE900970A48 /* prfchwintrin.h */, + 1F26117E1A57ECE900970A48 /* rdseedintrin.h */, + 1F26117F1A57ECE900970A48 /* rtmintrin.h */, + 1F2611881A57ECE900970A48 /* shaintrin.h */, + 1F2611891A57ECE900970A48 /* smmintrin.h */, + 1F26118A1A57ECE900970A48 /* stdalign.h */, + 1F26118B1A57ECE900970A48 /* stdarg.h */, + 1F26118C1A57ECE900970A48 /* stdbool.h */, + 1F26118D1A57ECE900970A48 /* stddef.h */, + 1F26118E1A57ECE900970A48 /* stdint.h */, + 1F26118F1A57ECE900970A48 /* stdnoreturn.h */, + 1F2611901A57ECE900970A48 /* tbmintrin.h */, + 1F2611911A57ECE900970A48 /* tgmath.h */, + 1F2611921A57ECE900970A48 /* tmmintrin.h */, + 1F2611931A57ECE900970A48 /* unwind.h */, + 1F2611941A57ECE900970A48 /* varargs.h */, + 1F2611951A57ECE900970A48 /* wmmintrin.h */, + 1F2611961A57ECE900970A48 /* x86intrin.h */, + 1F2611971A57ECE900970A48 /* xmmintrin.h */, + 1F2611981A57ECE900970A48 /* xopintrin.h */, + ); + name = "Clang Headers"; + path = Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/6.0/include; + sourceTree = DEVELOPER_DIR; + }; + 1F2611D31A58EE2800970A48 /* Rewriters */ = { + isa = PBXGroup; + children = ( + 1F2611D71A58F0C700970A48 /* objc_message_rewriter.cpp */, + 1F2611D81A58F0C700970A48 /* objc_message_rewriter.h */, + 1F2611D41A58EEF600970A48 /* objc_property_rewriter.cpp */, + 1F2611D51A58EEF600970A48 /* objc_property_rewriter.h */, + 1F2611DA1A58F15800970A48 /* unary_rewriter.cpp */, + 1F2611DB1A58F15800970A48 /* unary_rewriter.h */, + 1F2611E01A58F2E500970A48 /* prefix_rewriter.cpp */, + 1F2611E11A58F2E500970A48 /* prefix_rewriter.h */, + 1FF678AA1A5BCB1D004F54DA /* compound_stmt_rewriter.cpp */, + 1FF678AB1A5BCB1D004F54DA /* compound_stmt_rewriter.h */, + ); + path = Rewriters; + sourceTree = ""; + }; + 1F97E2EF1A55E75A00CE7EA4 /* Foxling */ = { + isa = PBXGroup; + children = ( + 1F97E2F01A55E75A00CE7EA4 /* main.cpp */, + 1F2611D11A58AC6E00970A48 /* objc_matchers.h */, + 1FDD0F061A5A79A80035D578 /* Rewriter.cpp */, + 1FDD0F081A5A79C40035D578 /* Rewriter.h */, + 1F2611D31A58EE2800970A48 /* Rewriters */, + 1F2611E31A5A035300970A48 /* source_rewriter.cpp */, + 1F2611E41A5A035300970A48 /* source_rewriter.h */, + 1FF679231A5D6280004F54DA /* helpers.cpp */, + 1FF679241A5D6280004F54DA /* helpers.h */, + ); + path = Foxling; + sourceTree = ""; + }; + 1F9A97EB1A49550000C3BB26 = { + isa = PBXGroup; + children = ( + 1FF678AE1A5C8DF4004F54DA /* bin */, + 1F97E2EF1A55E75A00CE7EA4 /* Foxling */, + 1FF678B21A5CC788004F54DA /* C++ Headers */, + 1F2611601A57ECE900970A48 /* Clang Headers */, + 1F23F8291A5EF0B200C8AD07 /* Foxling Compiler */, + 1F9A97F51A49550000C3BB26 /* Products */, + 1FDCAFEA1A5F019100012A37 /* LLVM */, + 1F9A991A1A49608E00C3BB26 /* LLVM & Clang Libraries */, + ); + sourceTree = ""; + }; + 1F9A97F51A49550000C3BB26 /* Products */ = { + isa = PBXGroup; + children = ( + 1F97E2EE1A55E75A00CE7EA4 /* Foxling */, + 1F23F8281A5EF0B200C8AD07 /* Foxling Compiler.xcplugin */, + ); + name = Products; + sourceTree = ""; + }; + 1F9A991A1A49608E00C3BB26 /* LLVM & Clang Libraries */ = { + isa = PBXGroup; + children = ( + 1F260FDC1A57DEDF00970A48 /* libc++abi.a */, + 1F260FDD1A57DEDF00970A48 /* libclangAnalysis.a */, + 1F260FDE1A57DEDF00970A48 /* libclangApplyReplacements.a */, + 1F260FDF1A57DEDF00970A48 /* libclangARCMigrate.a */, + 1F260FE01A57DEDF00970A48 /* libclangAST.a */, + 1F260FE11A57DEDF00970A48 /* libclangASTMatchers.a */, + 1F260FE21A57DEDF00970A48 /* libclangBasic.a */, + 1F260FE31A57DEDF00970A48 /* libclangCodeGen.a */, + 1F260FE41A57DEDF00970A48 /* libclangDriver.a */, + 1F260FE51A57DEDF00970A48 /* libclangDynamicASTMatchers.a */, + 1F260FE61A57DEDF00970A48 /* libclangEdit.a */, + 1F260FE71A57DEDF00970A48 /* libclangFormat.a */, + 1F260FE81A57DEDF00970A48 /* libclangFrontend.a */, + 1F260FE91A57DEDF00970A48 /* libclangFrontendTool.a */, + 1F260FEA1A57DEDF00970A48 /* libclangIndex.a */, + 1F260FEB1A57DEDF00970A48 /* libclangLex.a */, + 1F260FEC1A57DEDF00970A48 /* libclangParse.a */, + 1F260FED1A57DEDF00970A48 /* libclangQuery.a */, + 1F260FEE1A57DEDF00970A48 /* libclangRename.a */, + 1F260FEF1A57DEDF00970A48 /* libclangRewrite.a */, + 1F260FF01A57DEDF00970A48 /* libclangRewriteFrontend.a */, + 1F260FF11A57DEDF00970A48 /* libclangSema.a */, + 1F260FF21A57DEDF00970A48 /* libclangSerialization.a */, + 1F260FF31A57DEDF00970A48 /* libclangStaticAnalyzerCheckers.a */, + 1F260FF41A57DEDF00970A48 /* libclangStaticAnalyzerCore.a */, + 1F260FF51A57DEDF00970A48 /* libclangStaticAnalyzerFrontend.a */, + 1F260FFC1A57DEDF00970A48 /* libclangTooling.a */, + 1F260FFD1A57DEDF00970A48 /* libclangToolingCore.a */, + 1F2610001A57DEDF00970A48 /* libLLVMAArch64AsmParser.a */, + 1F2610011A57DEDF00970A48 /* libLLVMAArch64AsmPrinter.a */, + 1F2610021A57DEDF00970A48 /* libLLVMAArch64CodeGen.a */, + 1F2610031A57DEDF00970A48 /* libLLVMAArch64Desc.a */, + 1F2610041A57DEDF00970A48 /* libLLVMAArch64Disassembler.a */, + 1F2610051A57DEDF00970A48 /* libLLVMAArch64Info.a */, + 1F2610061A57DEDF00970A48 /* libLLVMAArch64Utils.a */, + 1F2610071A57DEDF00970A48 /* libLLVMAnalysis.a */, + 1F2610081A57DEDF00970A48 /* libLLVMARMAsmParser.a */, + 1F2610091A57DEDF00970A48 /* libLLVMARMAsmPrinter.a */, + 1F26100A1A57DEDF00970A48 /* libLLVMARMCodeGen.a */, + 1F26100B1A57DEDF00970A48 /* libLLVMARMDesc.a */, + 1F26100C1A57DEDF00970A48 /* libLLVMARMDisassembler.a */, + 1F26100D1A57DEDF00970A48 /* libLLVMARMInfo.a */, + 1F26100E1A57DEDF00970A48 /* libLLVMAsmParser.a */, + 1F26100F1A57DEDF00970A48 /* libLLVMAsmPrinter.a */, + 1F2610101A57DEDF00970A48 /* libLLVMBitReader.a */, + 1F2610111A57DEDF00970A48 /* libLLVMBitWriter.a */, + 1F2610121A57DEDF00970A48 /* libLLVMCodeGen.a */, + 1F2610131A57DEDF00970A48 /* libLLVMCore.a */, + 1F2610141A57DEDF00970A48 /* libLLVMCppBackendCodeGen.a */, + 1F2610151A57DEDF00970A48 /* libLLVMCppBackendInfo.a */, + 1F2610161A57DEDF00970A48 /* libLLVMDebugInfo.a */, + 1F2610171A57DEDF00970A48 /* libLLVMExecutionEngine.a */, + 1F2610181A57DEDF00970A48 /* libLLVMHexagonCodeGen.a */, + 1F2610191A57DEDF00970A48 /* libLLVMHexagonDesc.a */, + 1F26101A1A57DEDF00970A48 /* libLLVMHexagonDisassembler.a */, + 1F26101B1A57DEDF00970A48 /* libLLVMHexagonInfo.a */, + 1F26101C1A57DEDF00970A48 /* libLLVMInstCombine.a */, + 1F26101D1A57DEDF00970A48 /* libLLVMInstrumentation.a */, + 1F26101E1A57DEDF00970A48 /* libLLVMInterpreter.a */, + 1F26101F1A57DEDF00970A48 /* libLLVMipa.a */, + 1F2610201A57DEDF00970A48 /* libLLVMipo.a */, + 1F2610211A57DEDF00970A48 /* libLLVMIRReader.a */, + 1F2610221A57DEDF00970A48 /* libLLVMLineEditor.a */, + 1F2610231A57DEDF00970A48 /* libLLVMLinker.a */, + 1F2610241A57DEDF00970A48 /* libLLVMLTO.a */, + 1F2610251A57DEDF00970A48 /* libLLVMMC.a */, + 1F2610261A57DEDF00970A48 /* libLLVMMCDisassembler.a */, + 1F2610271A57DEDF00970A48 /* libLLVMMCJIT.a */, + 1F2610281A57DEDF00970A48 /* libLLVMMCParser.a */, + 1F2610291A57DEDF00970A48 /* libLLVMMipsAsmParser.a */, + 1F26102A1A57DEDF00970A48 /* libLLVMMipsAsmPrinter.a */, + 1F26102B1A57DEDF00970A48 /* libLLVMMipsCodeGen.a */, + 1F26102C1A57DEDF00970A48 /* libLLVMMipsDesc.a */, + 1F26102D1A57DEDF00970A48 /* libLLVMMipsDisassembler.a */, + 1F26102E1A57DEDF00970A48 /* libLLVMMipsInfo.a */, + 1F26102F1A57DEDF00970A48 /* libLLVMMSP430AsmPrinter.a */, + 1F2610301A57DEDF00970A48 /* libLLVMMSP430CodeGen.a */, + 1F2610311A57DEDF00970A48 /* libLLVMMSP430Desc.a */, + 1F2610321A57DEDF00970A48 /* libLLVMMSP430Info.a */, + 1F2610331A57DEDF00970A48 /* libLLVMNVPTXAsmPrinter.a */, + 1F2610341A57DEDF00970A48 /* libLLVMNVPTXCodeGen.a */, + 1F2610351A57DEDF00970A48 /* libLLVMNVPTXDesc.a */, + 1F2610361A57DEDF00970A48 /* libLLVMNVPTXInfo.a */, + 1F2610371A57DEDF00970A48 /* libLLVMObjCARCOpts.a */, + 1F2610381A57DEDF00970A48 /* libLLVMObject.a */, + 1F2610391A57DEDF00970A48 /* libLLVMOption.a */, + 1F26103A1A57DEDF00970A48 /* libLLVMPowerPCAsmParser.a */, + 1F26103B1A57DEDF00970A48 /* libLLVMPowerPCAsmPrinter.a */, + 1F26103C1A57DEDF00970A48 /* libLLVMPowerPCCodeGen.a */, + 1F26103D1A57DEDF00970A48 /* libLLVMPowerPCDesc.a */, + 1F26103E1A57DEDF00970A48 /* libLLVMPowerPCDisassembler.a */, + 1F26103F1A57DEDF00970A48 /* libLLVMPowerPCInfo.a */, + 1F2610401A57DEDF00970A48 /* libLLVMProfileData.a */, + 1F2610411A57DEDF00970A48 /* libLLVMR600AsmParser.a */, + 1F2610421A57DEDF00970A48 /* libLLVMR600AsmPrinter.a */, + 1F2610431A57DEDF00970A48 /* libLLVMR600CodeGen.a */, + 1F2610441A57DEDF00970A48 /* libLLVMR600Desc.a */, + 1F2610451A57DEDF00970A48 /* libLLVMR600Info.a */, + 1F2610461A57DEDF00970A48 /* libLLVMRuntimeDyld.a */, + 1F2610471A57DEDF00970A48 /* libLLVMScalarOpts.a */, + 1F2610481A57DEDF00970A48 /* libLLVMSelectionDAG.a */, + 1F2610491A57DEDF00970A48 /* libLLVMSparcAsmParser.a */, + 1F26104A1A57DEDF00970A48 /* libLLVMSparcAsmPrinter.a */, + 1F26104B1A57DEDF00970A48 /* libLLVMSparcCodeGen.a */, + 1F26104C1A57DEDF00970A48 /* libLLVMSparcDesc.a */, + 1F26104D1A57DEDF00970A48 /* libLLVMSparcDisassembler.a */, + 1F26104E1A57DEDF00970A48 /* libLLVMSparcInfo.a */, + 1F26104F1A57DEDF00970A48 /* libLLVMSupport.a */, + 1F2610501A57DEDF00970A48 /* libLLVMSystemZAsmParser.a */, + 1F2610511A57DEDF00970A48 /* libLLVMSystemZAsmPrinter.a */, + 1F2610521A57DEDF00970A48 /* libLLVMSystemZCodeGen.a */, + 1F2610531A57DEDF00970A48 /* libLLVMSystemZDesc.a */, + 1F2610541A57DEDF00970A48 /* libLLVMSystemZDisassembler.a */, + 1F2610551A57DEDF00970A48 /* libLLVMSystemZInfo.a */, + 1F2610561A57DEDF00970A48 /* libLLVMTableGen.a */, + 1F2610571A57DEDF00970A48 /* libLLVMTarget.a */, + 1F2610581A57DEDF00970A48 /* libLLVMTransformUtils.a */, + 1F2610591A57DEDF00970A48 /* libLLVMVectorize.a */, + 1F26105A1A57DEDF00970A48 /* libLLVMX86AsmParser.a */, + 1F26105B1A57DEDF00970A48 /* libLLVMX86AsmPrinter.a */, + 1F26105C1A57DEDF00970A48 /* libLLVMX86CodeGen.a */, + 1F26105D1A57DEDF00970A48 /* libLLVMX86Desc.a */, + 1F26105E1A57DEDF00970A48 /* libLLVMX86Disassembler.a */, + 1F26105F1A57DEDF00970A48 /* libLLVMX86Info.a */, + 1F2610601A57DEDF00970A48 /* libLLVMX86Utils.a */, + 1F2610611A57DEDF00970A48 /* libLLVMXCoreAsmPrinter.a */, + 1F2610621A57DEDF00970A48 /* libLLVMXCoreCodeGen.a */, + 1F2610631A57DEDF00970A48 /* libLLVMXCoreDesc.a */, + 1F2610641A57DEDF00970A48 /* libLLVMXCoreDisassembler.a */, + 1F2610651A57DEDF00970A48 /* libLLVMXCoreInfo.a */, + 1F97E2E61A55062000CE7EA4 /* libcurses.dylib */, + 1F97E2E41A55061300CE7EA4 /* libz.dylib */, + ); + name = "LLVM & Clang Libraries"; + sourceTree = ""; + }; + 1FDCAFEA1A5F019100012A37 /* LLVM */ = { + isa = PBXGroup; + children = ( + 1FDCAFEB1A5F020900012A37 /* download_and_build.sh */, + ); + path = LLVM; + sourceTree = ""; + }; + 1FF678AE1A5C8DF4004F54DA /* bin */ = { + isa = PBXGroup; + children = ( + 1FF678AF1A5C8E10004F54DA /* Fling */, + 1FAB84B81A5EEA2500F9BF07 /* Fling++ */, + ); + path = bin; + sourceTree = ""; + }; + 1FF678B21A5CC788004F54DA /* C++ Headers */ = { + isa = PBXGroup; + children = ( + 1FF6791F1A5CC7D4004F54DA /* c++ */, + 1FF6791C1A5CC788004F54DA /* FlexLexer.h */, + ); + name = "C++ Headers"; + path = Toolchains/XcodeDefault.xctoolchain/usr/include; + sourceTree = DEVELOPER_DIR; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1F23F8271A5EF0B200C8AD07 /* Foxling Compiler */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1F23F82E1A5EF0B200C8AD07 /* Build configuration list for PBXNativeTarget "Foxling Compiler" */; + buildPhases = ( + 1F23F8261A5EF0B200C8AD07 /* Resources */, + 1F23F8D51A5EF26100C8AD07 /* Copy Executables */, + 1F23F8DA1A5EF3E500C8AD07 /* Copy Clang Headers */, + 1F23F90C1A5EF41500C8AD07 /* Copy C++ Headers */, + ); + buildRules = ( + ); + dependencies = ( + 1F23F8C71A5EF22900C8AD07 /* PBXTargetDependency */, + ); + name = "Foxling Compiler"; + productName = FoxlingCompiler; + productReference = 1F23F8281A5EF0B200C8AD07 /* Foxling Compiler.xcplugin */; + productType = "com.apple.product-type.bundle"; + }; + 1F97E2ED1A55E75A00CE7EA4 /* Foxling */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1F97E2F21A55E75A00CE7EA4 /* Build configuration list for PBXNativeTarget "Foxling" */; + buildPhases = ( + 1F05976A1A66555E002E1816 /* Download LLVM & Clang If Needed */, + 1F97E2EA1A55E75A00CE7EA4 /* Sources */, + 1F97E2EB1A55E75A00CE7EA4 /* Frameworks */, + 1FF6791D1A5CC79A004F54DA /* Copy C++ Headers */, + 1F97E2EC1A55E75A00CE7EA4 /* Copy Clang Header */, + 1FF678B01A5CC195004F54DA /* Copy Binary Files */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Foxling; + productName = Foxling; + productReference = 1F97E2EE1A55E75A00CE7EA4 /* Foxling */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1F9A97EC1A49550000C3BB26 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + ORGANIZATIONNAME = "Jeff Hui"; + TargetAttributes = { + 1F23F8271A5EF0B200C8AD07 = { + CreatedOnToolsVersion = 6.1.1; + }; + 1F97E2ED1A55E75A00CE7EA4 = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 1F9A97EF1A49550000C3BB26 /* Build configuration list for PBXProject "Foxling" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + ); + mainGroup = 1F9A97EB1A49550000C3BB26; + productRefGroup = 1F9A97F51A49550000C3BB26 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1F97E2ED1A55E75A00CE7EA4 /* Foxling */, + 1F23F8271A5EF0B200C8AD07 /* Foxling Compiler */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1F23F8261A5EF0B200C8AD07 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1FA0A3501A5EF8CD006EA00C /* Foxling Compiler.xcspec in Resources */, + 1FA0A34F1A5EF8CD006EA00C /* English.lproj in Resources */, + 1FA0A34E1A5EF8CD006EA00C /* Default Compiler.xcspec in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1F05976A1A66555E002E1816 /* Download LLVM & Clang If Needed */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Download LLVM & Clang If Needed"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "if [ ! -d \"$SRCROOT/LLVM/llvm\" -a ! -d \"$SRCROOT/LLVM/llvm_build\" ]\nthen\n echo \"Downloading precompiled LLVM\"\n pushd $SRCROOT/LLVM\n $SRCROOT/LLVM/package.sh\n popd\nelse\n echo \"LLVM already exists.\"\nfi"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1F97E2EA1A55E75A00CE7EA4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1FF678AC1A5BCB1D004F54DA /* compound_stmt_rewriter.cpp in Sources */, + 1F2611DC1A58F15800970A48 /* unary_rewriter.cpp in Sources */, + 1FDD0F071A5A79A80035D578 /* Rewriter.cpp in Sources */, + 1F2611E51A5A035300970A48 /* source_rewriter.cpp in Sources */, + 1F2611E21A58F2E500970A48 /* prefix_rewriter.cpp in Sources */, + 1F2611D61A58EEF600970A48 /* objc_property_rewriter.cpp in Sources */, + 1F97E2F11A55E75A00CE7EA4 /* main.cpp in Sources */, + 1FF679251A5D6280004F54DA /* helpers.cpp in Sources */, + 1F2611D91A58F0C700970A48 /* objc_message_rewriter.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1F23F8C71A5EF22900C8AD07 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1F97E2ED1A55E75A00CE7EA4 /* Foxling */; + targetProxy = 1F23F8C61A5EF22900C8AD07 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1F23F82C1A5EF0B200C8AD07 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEPLOYMENT_LOCATION = YES; + DSTROOT = "$(USER_LIBRARY_DIR)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Foxling Compiler/Info.plist"; + INSTALL_PATH = "/Application Support/Developer/Shared/Xcode/Plug-ins/"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LLVM_DIR)/llvm_build/lib", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = NO; + WRAPPER_EXTENSION = xcplugin; + }; + name = Debug; + }; + 1F23F82D1A5EF0B200C8AD07 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEPLOYMENT_LOCATION = YES; + DSTROOT = "$(USER_LIBRARY_DIR)"; + INFOPLIST_FILE = "Foxling Compiler/Info.plist"; + INSTALL_PATH = "/Application Support/Developer/Shared/Xcode/Plug-ins/"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LLVM_DIR)/llvm_build/lib", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = NO; + WRAPPER_EXTENSION = xcplugin; + }; + name = Release; + }; + 1F97E2F31A55E75A00CE7EA4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "$(LLVM_HOME)/llvm_build/lib/**", + "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Fox-dmobuslqyltucubgnxyazjnfmyjr/Build/Products/Debug", + "$(LLVM_DIR)/llvm_build/lib", + ); + LLVM_HOME = "$(SRCROOT)/LLVM"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 1F97E2F41A55E75A00CE7EA4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LIBRARY_SEARCH_PATHS = ( + "$(LLVM_HOME)/llvm_build/lib/**", + "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Fox-dmobuslqyltucubgnxyazjnfmyjr/Build/Products/Debug", + "$(LLVM_DIR)/llvm_build/lib", + ); + LLVM_HOME = "$(SRCROOT)/LLVM"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 1F9A97FD1A49550000C3BB26 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + _GNU_SOURCE, + HAVE_CLANG_CONFIG_H, + __STDC_CONSTANT_MACROS, + __STDC_LIMIT_MACROS, + "DEBUG=1", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(LLVM_HOME)/llvm/tools/clang/include", + "$(LLVM_HOME)/llvm/include", + "$(LLVM_HOME)/llvm_build/tools/clang/include", + "$(LLVM_HOME)/llvm_build/include", + ); + LLVM_HOME = "$(SRCROOT)/../../llvm"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 1F9A97FE1A49550000C3BB26 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + _GNU_SOURCE, + HAVE_CLANG_CONFIG_H, + __STDC_CONSTANT_MACROS, + __STDC_LIMIT_MACROS, + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(LLVM_HOME)/llvm/tools/clang/include", + "$(LLVM_HOME)/llvm/include", + "$(LLVM_HOME)/llvm_build/tools/clang/include", + "$(LLVM_HOME)/llvm_build/include", + ); + LLVM_HOME = "$(SRCROOT)/../../llvm"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1F23F82E1A5EF0B200C8AD07 /* Build configuration list for PBXNativeTarget "Foxling Compiler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1F23F82C1A5EF0B200C8AD07 /* Debug */, + 1F23F82D1A5EF0B200C8AD07 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1F97E2F21A55E75A00CE7EA4 /* Build configuration list for PBXNativeTarget "Foxling" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1F97E2F31A55E75A00CE7EA4 /* Debug */, + 1F97E2F41A55E75A00CE7EA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1F9A97EF1A49550000C3BB26 /* Build configuration list for PBXProject "Foxling" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1F9A97FD1A49550000C3BB26 /* Debug */, + 1F9A97FE1A49550000C3BB26 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1F9A97EC1A49550000C3BB26 /* Project object */; +} diff --git a/Foxling/Foxling.xcodeproj/xcshareddata/xcschemes/Foxling Compiler.xcscheme b/Foxling/Foxling.xcodeproj/xcshareddata/xcschemes/Foxling Compiler.xcscheme new file mode 100644 index 0000000..f1240a4 --- /dev/null +++ b/Foxling/Foxling.xcodeproj/xcshareddata/xcschemes/Foxling Compiler.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Foxling/Foxling/Rewriter.cpp b/Foxling/Foxling/Rewriter.cpp new file mode 100644 index 0000000..40eacf9 --- /dev/null +++ b/Foxling/Foxling/Rewriter.cpp @@ -0,0 +1,509 @@ +//===--- Rewriter.cpp - Code rewriting interface --------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the Rewriter class, which is used for code +// transformations. +// +//===----------------------------------------------------------------------===// + +#include "Rewriter.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/FileManager.h" +#include "clang/Basic/SourceManager.h" +#include "clang/Lex/Lexer.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Config/llvm-config.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/raw_ostream.h" + +using namespace clang; +using namespace Foxling; + +raw_ostream &RewriteBuffer::write(raw_ostream &os) const { + // Walk RewriteRope chunks efficiently using MoveToNextPiece() instead of the + // character iterator. + for (RopePieceBTreeIterator I = begin(), E = end(); I != E; + I.MoveToNextPiece()) + os << I.piece(); + return os; +} + +/// \brief Return true if this character is non-new-line whitespace: +/// ' ', '\\t', '\\f', '\\v', '\\r'. +static inline bool isWhitespace(unsigned char c) { + switch (c) { + case ' ': + case '\t': + case '\f': + case '\v': + case '\r': + return true; + default: + return false; + } +} + +void RewriteBuffer::RemoveText(unsigned OrigOffset, unsigned Size, + bool removeLineIfEmpty) { + // Nothing to remove, exit early. + if (Size == 0) return; + + unsigned RealOffset = getMappedOffset(OrigOffset, true); + assert(RealOffset+Size < Buffer.size() && "Invalid location"); + + // Remove the dead characters. + Buffer.erase(RealOffset, Size); + + // Add a delta so that future changes are offset correctly. + AddReplaceDelta(OrigOffset, -Size); + + if (removeLineIfEmpty) { + // Find the line that the remove occurred and if it is completely empty + // remove the line as well. + + iterator curLineStart = begin(); + unsigned curLineStartOffs = 0; + iterator posI = begin(); + for (unsigned i = 0; i != RealOffset; ++i) { + if (*posI == '\n') { + curLineStart = posI; + ++curLineStart; + curLineStartOffs = i + 1; + } + ++posI; + } + + unsigned lineSize = 0; + posI = curLineStart; + while (posI != end() && isWhitespace(*posI)) { + ++posI; + ++lineSize; + } + if (posI != end() && *posI == '\n') { + Buffer.erase(curLineStartOffs, lineSize + 1/* + '\n'*/); + AddReplaceDelta(curLineStartOffs, -(lineSize + 1/* + '\n'*/)); + } + } +} + +void RewriteBuffer::InsertText(unsigned OrigOffset, StringRef Str, + bool InsertAfter) { + + // Nothing to insert, exit early. + if (Str.empty()) return; + + unsigned RealOffset = getMappedOffset(OrigOffset, InsertAfter); + Buffer.insert(RealOffset, Str.begin(), Str.end()); + + // Add a delta so that future changes are offset correctly. + AddInsertDelta(OrigOffset, Str.size()); +} + +/// ReplaceText - This method replaces a range of characters in the input +/// buffer with a new string. This is effectively a combined "remove+insert" +/// operation. +void RewriteBuffer::ReplaceText(unsigned OrigOffset, unsigned OrigLength, + StringRef NewStr) { + unsigned RealOffset = getMappedOffset(OrigOffset, true); + Buffer.erase(RealOffset, OrigLength); + Buffer.insert(RealOffset, NewStr.begin(), NewStr.end()); + if (OrigLength != NewStr.size()) + AddReplaceDelta(OrigOffset, NewStr.size() - OrigLength); +} + + +//===----------------------------------------------------------------------===// +// Rewriter class +//===----------------------------------------------------------------------===// + +/// getRangeSize - Return the size in bytes of the specified range if they +/// are in the same file. If not, this returns -1. +int Foxling::Rewriter::getRangeSize(const CharSourceRange &Range, + Foxling::Rewriter::RewriteOptions opts) const { + if (!isRewritable(Range.getBegin()) || + !isRewritable(Range.getEnd())) return -1; + + FileID StartFileID, EndFileID; + unsigned StartOff, EndOff; + + StartOff = getLocationOffsetAndFileID(Range.getBegin(), StartFileID); + EndOff = getLocationOffsetAndFileID(Range.getEnd(), EndFileID); + + if (StartFileID != EndFileID) + return -1; + + // If edits have been made to this buffer, the delta between the range may + // have changed. + std::map::const_iterator I = + RewriteBuffers.find(StartFileID); + if (I != RewriteBuffers.end()) { + const RewriteBuffer &RB = I->second; + EndOff = RB.getMappedOffset(EndOff, opts.IncludeInsertsAtEndOfRange); + StartOff = RB.getMappedOffset(StartOff, !opts.IncludeInsertsAtBeginOfRange); + } + + + // Adjust the end offset to the end of the last token, instead of being the + // start of the last token if this is a token range. + if (Range.isTokenRange()) + EndOff += Lexer::MeasureTokenLength(Range.getEnd(), *SourceMgr, *LangOpts); + + return EndOff-StartOff; +} + +int Foxling::Rewriter::getRangeSize(SourceRange Range, Foxling::Rewriter::RewriteOptions opts) const { + return getRangeSize(CharSourceRange::getTokenRange(Range), opts); +} + +/// Fox Addition +std::string Foxling::Rewriter::getRewrittenText(SourceRange Range, int StartDelta, int EndDelta) const { + FileID StartFileID, EndFileID; + unsigned StartOff, EndOff; + StartOff = getLocationOffsetAndFileID(Range.getBegin(), StartFileID); + EndOff = getLocationOffsetAndFileID(Range.getEnd(), EndFileID); + + if (StartFileID != EndFileID) + return ""; // Start and end in different buffers. + + // If edits have been made to this buffer, the delta between the range may + // have changed. + std::map::const_iterator I = + RewriteBuffers.find(StartFileID); + if (I == RewriteBuffers.end()) { + // If the buffer hasn't been rewritten, just return the text from the input. + const char *Ptr = SourceMgr->getCharacterData(Range.getBegin()); + + // Adjust the end offset to the end of the last token, instead of being the + // start of the last token. + EndOff += Lexer::MeasureTokenLength(Range.getEnd(), *SourceMgr, *LangOpts); + return std::string(Ptr, Ptr+EndOff-StartOff); + } + + const RewriteBuffer &RB = I->second; + EndOff = RB.getMappedOffset(EndOff, true); + StartOff = RB.getMappedOffset(StartOff); + + // Adjust the end offset to the end of the last token, instead of being the + // start of the last token. + EndOff += Lexer::MeasureTokenLength(Range.getEnd(), *SourceMgr, *LangOpts); + StartOff += StartDelta; + EndOff += EndDelta; + EndOff = std::max(StartOff, EndOff); + + // Advance the iterators to the right spot, yay for linear time algorithms. + RewriteBuffer::iterator Start = RB.begin(); + std::advance(Start, StartOff); + RewriteBuffer::iterator End = Start; + std::advance(End, EndOff-StartOff); + + return std::string(Start, End); +} + +/// getRewrittenText - Return the rewritten form of the text in the specified +/// range. If the start or end of the range was unrewritable or if they are +/// in different buffers, this returns an empty string. +/// +/// Note that this method is not particularly efficient. +/// +std::string Foxling::Rewriter::getRewrittenText(SourceRange Range) const { + if (!isRewritable(Range.getBegin()) || + !isRewritable(Range.getEnd())) + return ""; + + FileID StartFileID, EndFileID; + unsigned StartOff, EndOff; + StartOff = getLocationOffsetAndFileID(Range.getBegin(), StartFileID); + EndOff = getLocationOffsetAndFileID(Range.getEnd(), EndFileID); + + if (StartFileID != EndFileID) + return ""; // Start and end in different buffers. + + // If edits have been made to this buffer, the delta between the range may + // have changed. + std::map::const_iterator I = + RewriteBuffers.find(StartFileID); + if (I == RewriteBuffers.end()) { + // If the buffer hasn't been rewritten, just return the text from the input. + const char *Ptr = SourceMgr->getCharacterData(Range.getBegin()); + + // Adjust the end offset to the end of the last token, instead of being the + // start of the last token. + EndOff += Lexer::MeasureTokenLength(Range.getEnd(), *SourceMgr, *LangOpts); + return std::string(Ptr, Ptr+EndOff-StartOff); + } + + const RewriteBuffer &RB = I->second; + EndOff = RB.getMappedOffset(EndOff, true); + StartOff = RB.getMappedOffset(StartOff); + + // Adjust the end offset to the end of the last token, instead of being the + // start of the last token. + EndOff += Lexer::MeasureTokenLength(Range.getEnd(), *SourceMgr, *LangOpts); + + // Advance the iterators to the right spot, yay for linear time algorithms. + RewriteBuffer::iterator Start = RB.begin(); + std::advance(Start, StartOff); + RewriteBuffer::iterator End = Start; + std::advance(End, EndOff-StartOff); + + return std::string(Start, End); +} + +unsigned Foxling::Rewriter::getLocationOffsetAndFileID(SourceLocation Loc, + FileID &FID) const { + assert(Loc.isValid() && "Invalid location"); + std::pair V = SourceMgr->getDecomposedLoc(Loc); + FID = V.first; + return V.second; +} + + +/// getEditBuffer - Get or create a RewriteBuffer for the specified FileID. +/// +RewriteBuffer &Foxling::Rewriter::getEditBuffer(FileID FID) { + std::map::iterator I = + RewriteBuffers.lower_bound(FID); + if (I != RewriteBuffers.end() && I->first == FID) + return I->second; + I = RewriteBuffers.insert(I, std::make_pair(FID, RewriteBuffer())); + + StringRef MB = SourceMgr->getBufferData(FID); + I->second.Initialize(MB.begin(), MB.end()); + + return I->second; +} + +/// InsertText - Insert the specified string at the specified location in the +/// original buffer. +bool Foxling::Rewriter::InsertText(SourceLocation Loc, StringRef Str, + bool InsertAfter, bool indentNewLines) { + if (!isRewritable(Loc)) return true; + FileID FID; + unsigned StartOffs = getLocationOffsetAndFileID(Loc, FID); + + SmallString<128> indentedStr; + if (indentNewLines && Str.find('\n') != StringRef::npos) { + StringRef MB = SourceMgr->getBufferData(FID); + + unsigned lineNo = SourceMgr->getLineNumber(FID, StartOffs) - 1; + const SrcMgr::ContentCache * + Content = SourceMgr->getSLocEntry(FID).getFile().getContentCache(); + unsigned lineOffs = Content->SourceLineCache[lineNo]; + + // Find the whitespace at the start of the line. + StringRef indentSpace; + { + unsigned i = lineOffs; + while (isWhitespace(MB[i])) + ++i; + indentSpace = MB.substr(lineOffs, i-lineOffs); + } + + SmallVector lines; + Str.split(lines, "\n"); + + for (unsigned i = 0, e = lines.size(); i != e; ++i) { + indentedStr += lines[i]; + if (i < e-1) { + indentedStr += '\n'; + indentedStr += indentSpace; + } + } + Str = indentedStr.str(); + } + + getEditBuffer(FID).InsertText(StartOffs, Str, InsertAfter); + return false; +} + +bool Foxling::Rewriter::InsertTextAfterToken(SourceLocation Loc, StringRef Str) { + if (!isRewritable(Loc)) return true; + FileID FID; + unsigned StartOffs = getLocationOffsetAndFileID(Loc, FID); + RewriteOptions rangeOpts; + rangeOpts.IncludeInsertsAtBeginOfRange = false; + StartOffs += getRangeSize(SourceRange(Loc, Loc), rangeOpts); + getEditBuffer(FID).InsertText(StartOffs, Str, /*InsertAfter*/true); + return false; +} + +/// RemoveText - Remove the specified text region. +bool Foxling::Rewriter::RemoveText(SourceLocation Start, unsigned Length, + RewriteOptions opts) { + if (!isRewritable(Start)) return true; + FileID FID; + unsigned StartOffs = getLocationOffsetAndFileID(Start, FID); + getEditBuffer(FID).RemoveText(StartOffs, Length, opts.RemoveLineIfEmpty); + return false; +} + +/// ReplaceText - This method replaces a range of characters in the input +/// buffer with a new string. This is effectively a combined "remove/insert" +/// operation. +bool Foxling::Rewriter::ReplaceText(SourceLocation Start, unsigned OrigLength, + StringRef NewStr) { + if (!isRewritable(Start)) return true; + FileID StartFileID; + unsigned StartOffs = getLocationOffsetAndFileID(Start, StartFileID); + + getEditBuffer(StartFileID).ReplaceText(StartOffs, OrigLength, NewStr); + return false; +} + +bool Foxling::Rewriter::ReplaceText(SourceRange range, SourceRange replacementRange) { + if (!isRewritable(range.getBegin())) return true; + if (!isRewritable(range.getEnd())) return true; + if (replacementRange.isInvalid()) return true; + SourceLocation start = range.getBegin(); + unsigned origLength = getRangeSize(range); + unsigned newLength = getRangeSize(replacementRange); + FileID FID; + unsigned newOffs = getLocationOffsetAndFileID(replacementRange.getBegin(), + FID); + StringRef MB = SourceMgr->getBufferData(FID); + return ReplaceText(start, origLength, MB.substr(newOffs, newLength)); +} + +bool Foxling::Rewriter::IncreaseIndentation(CharSourceRange range, + SourceLocation parentIndent) { + if (range.isInvalid()) return true; + if (!isRewritable(range.getBegin())) return true; + if (!isRewritable(range.getEnd())) return true; + if (!isRewritable(parentIndent)) return true; + + FileID StartFileID, EndFileID, parentFileID; + unsigned StartOff, EndOff, parentOff; + + StartOff = getLocationOffsetAndFileID(range.getBegin(), StartFileID); + EndOff = getLocationOffsetAndFileID(range.getEnd(), EndFileID); + parentOff = getLocationOffsetAndFileID(parentIndent, parentFileID); + + if (StartFileID != EndFileID || StartFileID != parentFileID) + return true; + if (StartOff > EndOff) + return true; + + FileID FID = StartFileID; + StringRef MB = SourceMgr->getBufferData(FID); + + unsigned parentLineNo = SourceMgr->getLineNumber(FID, parentOff) - 1; + unsigned startLineNo = SourceMgr->getLineNumber(FID, StartOff) - 1; + unsigned endLineNo = SourceMgr->getLineNumber(FID, EndOff) - 1; + + const SrcMgr::ContentCache * + Content = SourceMgr->getSLocEntry(FID).getFile().getContentCache(); + + // Find where the lines start. + unsigned parentLineOffs = Content->SourceLineCache[parentLineNo]; + unsigned startLineOffs = Content->SourceLineCache[startLineNo]; + + // Find the whitespace at the start of each line. + StringRef parentSpace, startSpace; + { + unsigned i = parentLineOffs; + while (isWhitespace(MB[i])) + ++i; + parentSpace = MB.substr(parentLineOffs, i-parentLineOffs); + + i = startLineOffs; + while (isWhitespace(MB[i])) + ++i; + startSpace = MB.substr(startLineOffs, i-startLineOffs); + } + if (parentSpace.size() >= startSpace.size()) + return true; + if (!startSpace.startswith(parentSpace)) + return true; + + StringRef indent = startSpace.substr(parentSpace.size()); + + // Indent the lines between start/end offsets. + RewriteBuffer &RB = getEditBuffer(FID); + for (unsigned lineNo = startLineNo; lineNo <= endLineNo; ++lineNo) { + unsigned offs = Content->SourceLineCache[lineNo]; + unsigned i = offs; + while (isWhitespace(MB[i])) + ++i; + StringRef origIndent = MB.substr(offs, i-offs); + if (origIndent.startswith(startSpace)) + RB.InsertText(offs, indent, /*InsertAfter=*/false); + } + + return false; +} + +namespace { +// A wrapper for a file stream that atomically overwrites the target. +// +// Creates a file output stream for a temporary file in the constructor, +// which is later accessible via getStream() if ok() return true. +// Flushes the stream and moves the temporary file to the target location +// in the destructor. +class AtomicallyMovedFile { +public: + AtomicallyMovedFile(DiagnosticsEngine &Diagnostics, StringRef Filename, + bool &AllWritten) + : Diagnostics(Diagnostics), Filename(Filename), AllWritten(AllWritten) { + TempFilename = Filename; + TempFilename += "-%%%%%%%%"; + int FD; + if (llvm::sys::fs::createUniqueFile(TempFilename.str(), FD, TempFilename)) { + AllWritten = false; + Diagnostics.Report(clang::diag::err_unable_to_make_temp) + << TempFilename; + } else { + FileStream.reset(new llvm::raw_fd_ostream(FD, /*shouldClose=*/true)); + } + } + + ~AtomicallyMovedFile() { + if (!ok()) return; + + FileStream->flush(); +#ifdef LLVM_ON_WIN32 + // Win32 does not allow rename/removing opened files. + FileStream.reset(); +#endif + if (std::error_code ec = + llvm::sys::fs::rename(TempFilename.str(), Filename)) { + AllWritten = false; + Diagnostics.Report(clang::diag::err_unable_to_rename_temp) + << TempFilename << Filename << ec.message(); + // If the remove fails, there's not a lot we can do - this is already an + // error. + llvm::sys::fs::remove(TempFilename.str()); + } + } + + bool ok() { return (bool)FileStream; } + raw_ostream &getStream() { return *FileStream; } + +private: + DiagnosticsEngine &Diagnostics; + StringRef Filename; + SmallString<128> TempFilename; + std::unique_ptr FileStream; + bool &AllWritten; +}; +} // end anonymous namespace + +bool Foxling::Rewriter::overwriteChangedFiles() { + bool AllWritten = true; + for (buffer_iterator I = buffer_begin(), E = buffer_end(); I != E; ++I) { + const FileEntry *Entry = + getSourceMgr().getFileEntryForID(I->first); + AtomicallyMovedFile File(getSourceMgr().getDiagnostics(), Entry->getName(), + AllWritten); + if (File.ok()) { + I->second.write(File.getStream()); + } + } + return !AllWritten; +} diff --git a/Foxling/Foxling/Rewriter.h b/Foxling/Foxling/Rewriter.h new file mode 100644 index 0000000..440d63c --- /dev/null +++ b/Foxling/Foxling/Rewriter.h @@ -0,0 +1,297 @@ +//===--- Rewriter.h - Code rewriting interface ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the Rewriter class, which is used for code +// transformations. +// +//===----------------------------------------------------------------------===// + +#ifndef __Foxling__rewriter__ +#define __Foxling__rewriter__ + +#include "clang/Basic/SourceLocation.h" +#include "clang/Rewrite/Core/DeltaTree.h" +#include "clang/Rewrite/Core/RewriteRope.h" +#include "llvm/ADT/StringRef.h" +#include +#include +#include + +namespace clang { + class LangOptions; + class Rewriter; + class SourceManager; +} + +namespace Foxling { + using namespace clang; + +/// RewriteBuffer - As code is rewritten, SourceBuffer's from the original +/// input with modifications get a new RewriteBuffer associated with them. The +/// RewriteBuffer captures the modified text itself as well as information used +/// to map between SourceLocation's in the original input and offsets in the +/// RewriteBuffer. For example, if text is inserted into the buffer, any +/// locations after the insertion point have to be mapped. +class RewriteBuffer { + friend class Rewriter; + /// Deltas - Keep track of all the deltas in the source code due to insertions + /// and deletions. + clang::DeltaTree Deltas; + clang::RewriteRope Buffer; +public: + typedef clang::RewriteRope::const_iterator iterator; + iterator begin() const { return Buffer.begin(); } + iterator end() const { return Buffer.end(); } + unsigned size() const { return Buffer.size(); } + + /// \brief Write to \p Stream the result of applying all changes to the + /// original buffer. + /// Note that it isn't safe to use this function to overwrite memory mapped + /// files in-place (PR17960). Consider using a higher-level utility such as + /// Rewriter::overwriteChangedFiles() instead. + /// + /// The original buffer is not actually changed. + clang::raw_ostream &write(raw_ostream &Stream) const; + + /// RemoveText - Remove the specified text. + void RemoveText(unsigned OrigOffset, unsigned Size, + bool removeLineIfEmpty = false); + + /// InsertText - Insert some text at the specified point, where the offset in + /// the buffer is specified relative to the original SourceBuffer. The + /// text is inserted after the specified location. + /// + void InsertText(unsigned OrigOffset, StringRef Str, + bool InsertAfter = true); + + + /// InsertTextBefore - Insert some text before the specified point, where the + /// offset in the buffer is specified relative to the original + /// SourceBuffer. The text is inserted before the specified location. This is + /// method is the same as InsertText with "InsertAfter == false". + void InsertTextBefore(unsigned OrigOffset, StringRef Str) { + InsertText(OrigOffset, Str, false); + } + + /// InsertTextAfter - Insert some text at the specified point, where the + /// offset in the buffer is specified relative to the original SourceBuffer. + /// The text is inserted after the specified location. + void InsertTextAfter(unsigned OrigOffset, StringRef Str) { + InsertText(OrigOffset, Str); + } + + /// ReplaceText - This method replaces a range of characters in the input + /// buffer with a new string. This is effectively a combined "remove/insert" + /// operation. + void ReplaceText(unsigned OrigOffset, unsigned OrigLength, + StringRef NewStr); + +private: // Methods only usable by Rewriter. + + /// Initialize - Start this rewrite buffer out with a copy of the unmodified + /// input buffer. + void Initialize(const char *BufStart, const char *BufEnd) { + Buffer.assign(BufStart, BufEnd); + } + + /// getMappedOffset - Given an offset into the original SourceBuffer that this + /// RewriteBuffer is based on, map it into the offset space of the + /// RewriteBuffer. If AfterInserts is true and if the OrigOffset indicates a + /// position where text is inserted, the location returned will be after any + /// inserted text at the position. + unsigned getMappedOffset(unsigned OrigOffset, + bool AfterInserts = false) const{ + return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset; + } + + /// AddInsertDelta - When an insertion is made at a position, this + /// method is used to record that information. + void AddInsertDelta(unsigned OrigOffset, int Change) { + return Deltas.AddDelta(2*OrigOffset, Change); + } + + /// AddReplaceDelta - When a replacement/deletion is made at a position, this + /// method is used to record that information. + void AddReplaceDelta(unsigned OrigOffset, int Change) { + return Deltas.AddDelta(2*OrigOffset+1, Change); + } +}; + + +/// Rewriter - This is the main interface to the rewrite buffers. Its primary +/// job is to dispatch high-level requests to the low-level RewriteBuffers that +/// are involved. +class Rewriter { + SourceManager *SourceMgr; + const LangOptions *LangOpts; + std::map RewriteBuffers; +public: + struct RewriteOptions { + /// \brief Given a source range, true to include previous inserts at the + /// beginning of the range as part of the range itself (true by default). + bool IncludeInsertsAtBeginOfRange; + /// \brief Given a source range, true to include previous inserts at the + /// end of the range as part of the range itself (true by default). + bool IncludeInsertsAtEndOfRange; + /// \brief If true and removing some text leaves a blank line + /// also remove the empty line (false by default). + bool RemoveLineIfEmpty; + + RewriteOptions() + : IncludeInsertsAtBeginOfRange(true), + IncludeInsertsAtEndOfRange(true), + RemoveLineIfEmpty(false) { } + }; + + typedef std::map::iterator buffer_iterator; + typedef std::map::const_iterator const_buffer_iterator; + + explicit Rewriter(SourceManager &SM, const LangOptions &LO) + : SourceMgr(&SM), LangOpts(&LO) {} + explicit Rewriter() : SourceMgr(nullptr), LangOpts(nullptr) {} + + void setSourceMgr(SourceManager &SM, const LangOptions &LO) { + SourceMgr = &SM; + LangOpts = &LO; + } + SourceManager &getSourceMgr() const { return *SourceMgr; } + const LangOptions &getLangOpts() const { return *LangOpts; } + + /// isRewritable - Return true if this location is a raw file location, which + /// is rewritable. Locations from macros, etc are not rewritable. + static bool isRewritable(SourceLocation Loc) { + return Loc.isFileID(); + } + + /// getRangeSize - Return the size in bytes of the specified range if they + /// are in the same file. If not, this returns -1. + int getRangeSize(SourceRange Range, + RewriteOptions opts = RewriteOptions()) const; + int getRangeSize(const CharSourceRange &Range, + RewriteOptions opts = RewriteOptions()) const; + + /// Foxling ADDITION + std::string getRewrittenText(SourceRange Range, int StartDelta, int EndDelta) const; + + /// getRewrittenText - Return the rewritten form of the text in the specified + /// range. If the start or end of the range was unrewritable or if they are + /// in different buffers, this returns an empty string. + /// + /// Note that this method is not particularly efficient. + /// + std::string getRewrittenText(SourceRange Range) const; + + /// InsertText - Insert the specified string at the specified location in the + /// original buffer. This method returns true (and does nothing) if the input + /// location was not rewritable, false otherwise. + /// + /// \param indentNewLines if true new lines in the string are indented + /// using the indentation of the source line in position \p Loc. + bool InsertText(SourceLocation Loc, StringRef Str, + bool InsertAfter = true, bool indentNewLines = false); + + /// InsertTextAfter - Insert the specified string at the specified location in + /// the original buffer. This method returns true (and does nothing) if + /// the input location was not rewritable, false otherwise. Text is + /// inserted after any other text that has been previously inserted + /// at the some point (the default behavior for InsertText). + bool InsertTextAfter(SourceLocation Loc, StringRef Str) { + return InsertText(Loc, Str); + } + + /// \brief Insert the specified string after the token in the + /// specified location. + bool InsertTextAfterToken(SourceLocation Loc, StringRef Str); + + /// InsertText - Insert the specified string at the specified location in the + /// original buffer. This method returns true (and does nothing) if the input + /// location was not rewritable, false otherwise. Text is + /// inserted before any other text that has been previously inserted + /// at the some point. + bool InsertTextBefore(SourceLocation Loc, StringRef Str) { + return InsertText(Loc, Str, false); + } + + /// RemoveText - Remove the specified text region. + bool RemoveText(SourceLocation Start, unsigned Length, + RewriteOptions opts = RewriteOptions()); + + /// \brief Remove the specified text region. + bool RemoveText(CharSourceRange range, + RewriteOptions opts = RewriteOptions()) { + return RemoveText(range.getBegin(), getRangeSize(range, opts), opts); + } + + /// \brief Remove the specified text region. + bool RemoveText(SourceRange range, RewriteOptions opts = RewriteOptions()) { + return RemoveText(range.getBegin(), getRangeSize(range, opts), opts); + } + + /// ReplaceText - This method replaces a range of characters in the input + /// buffer with a new string. This is effectively a combined "remove/insert" + /// operation. + bool ReplaceText(SourceLocation Start, unsigned OrigLength, + StringRef NewStr); + + /// ReplaceText - This method replaces a range of characters in the input + /// buffer with a new string. This is effectively a combined "remove/insert" + /// operation. + bool ReplaceText(SourceRange range, StringRef NewStr) { + return ReplaceText(range.getBegin(), getRangeSize(range), NewStr); + } + + /// ReplaceText - This method replaces a range of characters in the input + /// buffer with a new string. This is effectively a combined "remove/insert" + /// operation. + bool ReplaceText(SourceRange range, SourceRange replacementRange); + + /// \brief Increase indentation for the lines between the given source range. + /// To determine what the indentation should be, 'parentIndent' is used + /// that should be at a source location with an indentation one degree + /// lower than the given range. + bool IncreaseIndentation(CharSourceRange range, SourceLocation parentIndent); + bool IncreaseIndentation(SourceRange range, SourceLocation parentIndent) { + return IncreaseIndentation(CharSourceRange::getTokenRange(range), + parentIndent); + } + + /// getEditBuffer - This is like getRewriteBufferFor, but always returns a + /// buffer, and allows you to write on it directly. This is useful if you + /// want efficient low-level access to apis for scribbling on one specific + /// FileID's buffer. + RewriteBuffer &getEditBuffer(FileID FID); + + /// getRewriteBufferFor - Return the rewrite buffer for the specified FileID. + /// If no modification has been made to it, return null. + const RewriteBuffer *getRewriteBufferFor(FileID FID) const { + std::map::const_iterator I = + RewriteBuffers.find(FID); + return I == RewriteBuffers.end() ? nullptr : &I->second; + } + + // Iterators over rewrite buffers. + buffer_iterator buffer_begin() { return RewriteBuffers.begin(); } + buffer_iterator buffer_end() { return RewriteBuffers.end(); } + const_buffer_iterator buffer_begin() const { return RewriteBuffers.begin(); } + const_buffer_iterator buffer_end() const { return RewriteBuffers.end(); } + + /// overwriteChangedFiles - Save all changed files to disk. + /// + /// Returns true if any files were not saved successfully. + /// Outputs diagnostics via the source manager's diagnostic engine + /// in case of an error. + bool overwriteChangedFiles(); + +private: + unsigned getLocationOffsetAndFileID(SourceLocation Loc, FileID &FID) const; +}; + +} // end namespace clang + +#endif diff --git a/Foxling/Foxling/Rewriters/compound_stmt_rewriter.cpp b/Foxling/Foxling/Rewriters/compound_stmt_rewriter.cpp new file mode 100644 index 0000000..89336a9 --- /dev/null +++ b/Foxling/Foxling/Rewriters/compound_stmt_rewriter.cpp @@ -0,0 +1,28 @@ +#include "compound_stmt_rewriter.h" + +bool Foxling::isYieldCallExpr(const CallExpr *callExpr) { + if (const ImplicitCastExpr *castExpr = dyn_cast_or_null(callExpr->getCallee())) { + if (const DeclRefExpr *declRefExpr = dyn_cast_or_null(castExpr->getSubExpr())) { + if (const NamedDecl *namedDecl = dyn_cast_or_null(declRefExpr->getDecl())) { + if (namedDecl->getNameAsString() == "fthread_yield") { + return true; + } + } + } + } + return false; +} + +void Foxling::CompoundStmtRewriter::run(const MatchFinder::MatchResult &Result) { + if (const CompoundStmt *stmts = Result.Nodes.getNodeAs(BindKey)) { + for (auto it = stmts->body_begin(); it != stmts->body_end(); it++) { + Stmt *stmt = *it; + if (const CallExpr *callExpr = dyn_cast_or_null(stmt)) { + if (isYieldCallExpr(callExpr)) { + continue; + } + } + Rewrite.InsertText(stmt->getLocStart(), Inject + " "); + } + } +} diff --git a/Foxling/Foxling/Rewriters/compound_stmt_rewriter.h b/Foxling/Foxling/Rewriters/compound_stmt_rewriter.h new file mode 100644 index 0000000..c2422f3 --- /dev/null +++ b/Foxling/Foxling/Rewriters/compound_stmt_rewriter.h @@ -0,0 +1,49 @@ +#ifndef __Foxling__compound_stmt_rewriter__ +#define __Foxling__compound_stmt_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "source_rewriter.h" + +namespace Foxling { + using namespace clang; + using namespace clang::ast_matchers; + + /// Returns true if the given callExpr is the yield statement: + /// fthread_yield(); + /// + bool isYieldCallExpr(const CallExpr *callExpr); + + /// Rewrites compound statements by interleaving yield statements: + /// { + /// int b; + /// b = a(); + /// return 2 + b; + /// } => { + /// fthread_yield(); + /// int b; + /// fthread_yield(); + /// b = a(); + /// fthread_yield(); + /// return 2 + b; + /// } + /// + /// Note that it does not conform to traditional C89 specifications that + /// requires local variables to be declared before any other statements. + /// (C99 removes that limitation). + /// + /// + class CompoundStmtRewriter : public MatchFinder::MatchCallback { + public: + CompoundStmtRewriter(SourceRewriter &r, std::string inject, std::string key) + : Rewrite(r), Inject(inject), BindKey(key) {} + + void run(const MatchFinder::MatchResult &Result); + private: + SourceRewriter &Rewrite; + std::string Inject; + std::string BindKey; + }; +} + +#endif /* defined(__Foxling__compound_stmt_rewriter__) */ diff --git a/Foxling/Foxling/Rewriters/objc_message_rewriter.cpp b/Foxling/Foxling/Rewriters/objc_message_rewriter.cpp new file mode 100644 index 0000000..cac7920 --- /dev/null +++ b/Foxling/Foxling/Rewriters/objc_message_rewriter.cpp @@ -0,0 +1,23 @@ +#include "objc_message_rewriter.h" +#include "helpers.h" + +void Foxling::ObjCMessageRewriter::run(const MatchFinder::MatchResult &Result) { + if (const ObjCMessageExpr *msgExpr = Result.Nodes.getNodeAs(BindKey)) { + // don't insert yields for property accesses to self + SourceRange receiverRange = msgExpr->getReceiverRange(); + if (receiverRange.getBegin() != receiverRange.getEnd()) { + std::string receiverExprStr = msgExpr->getReceiverType().getAsString(); + char *str; + allocate_sprintf(&str, "({ %s __receiver__%lu = ", + receiverExprStr.c_str(), + (uintptr_t)msgExpr); + Rewrite.InsertText(receiverRange.getBegin(), str); + free(str); + allocate_sprintf(&str, "; %s __receiver__%lu; })", + InjectCode.c_str(), + (uintptr_t)msgExpr); + Rewrite.InsertTextAfterToken(receiverRange.getEnd(), str); + free(str); + } + } +} diff --git a/Foxling/Foxling/Rewriters/objc_message_rewriter.h b/Foxling/Foxling/Rewriters/objc_message_rewriter.h new file mode 100644 index 0000000..3561b9c --- /dev/null +++ b/Foxling/Foxling/Rewriters/objc_message_rewriter.h @@ -0,0 +1,38 @@ +#ifndef __Foxling__objc_message_rewriter__ +#define __Foxling__objc_message_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include +#include +#include "source_rewriter.h" + +namespace Foxling { + + using namespace clang; + using namespace clang::ast_matchers; + + + /// Rewrites literal objc message sends to add a yield. + /// [obj msg]; => { + /// id __receiver = obj; + /// fthread_yield(); + /// [__receiver msg]; + /// }; + /// + /// Property accesses are IGNORED for this rewriter + class ObjCMessageRewriter : public MatchFinder::MatchCallback { + public: + ObjCMessageRewriter(SourceRewriter &r, std::string code, std::string key) + : Rewrite(r), InjectCode(code), BindKey(key) {} + + void run(const MatchFinder::MatchResult &Result); + private: + SourceRewriter &Rewrite; + std::string InjectCode; + std::string BindKey; + }; + +} + +#endif /* defined(__Foxling__objc_message_rewriter__) */ diff --git a/Foxling/Foxling/Rewriters/objc_property_rewriter.cpp b/Foxling/Foxling/Rewriters/objc_property_rewriter.cpp new file mode 100644 index 0000000..36c1a63 --- /dev/null +++ b/Foxling/Foxling/Rewriters/objc_property_rewriter.cpp @@ -0,0 +1,34 @@ +#include "objc_property_rewriter.h" +#include "clang/AST/AST.h" +#include "helpers.h" + +using namespace llvm; + +void Foxling::ObjCPropertyRewriter::run(const MatchFinder::MatchResult &Result) { + if (const ObjCPropertyRefExpr *propertyExpr = Result.Nodes.getNodeAs(BindKey)) { + if (propertyExpr->isMessagingGetter()) { + // no op. Multiple dot-accesses seem to be also + // match as message send expressions. + } else if (propertyExpr->isMessagingSetter()) { + auto start = propertyExpr->child_begin(); + std::advance(start, 3); // seems like a bad idea + + // don't insert yield inside constant expr + if (!isConstantExpression(*start)) { + auto exprType = propertyExpr->getSetterArgType().getAsString(); + char *str; + allocate_sprintf(&str, "({ %s __prop_expr__%lu = ", + exprType.c_str(), + (uintptr_t)propertyExpr); + Rewrite.InsertText(start->getLocStart(), str); + free(str); + + allocate_sprintf(&str, "; %s __prop_expr__%lu; })", + InjectCode.c_str(), + (uintptr_t)propertyExpr); + Rewrite.InsertTextAfterToken(start->getLocEnd(), str); + free(str); + } + } + } +} diff --git a/Foxling/Foxling/Rewriters/objc_property_rewriter.h b/Foxling/Foxling/Rewriters/objc_property_rewriter.h new file mode 100644 index 0000000..8e99ac8 --- /dev/null +++ b/Foxling/Foxling/Rewriters/objc_property_rewriter.h @@ -0,0 +1,37 @@ +#ifndef __Foxling__objc_property_rewriter__ +#define __Foxling__objc_property_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "source_rewriter.h" + +namespace Foxling { + + using namespace clang; + using namespace clang::ast_matchers; + + /// Rewrites literal objc property accesses to add a yield. + /// obj.p1 = foo => obj.p1 = { + /// id __receiver = foo; + /// fthread_yield(); + /// __receiver; + /// }.p1 + /// + /// obj.p1 = 2 => obj.p1 = 2; (unchanged) + /// + /// Does not yield for getters. Message send does this. + + class ObjCPropertyRewriter : public MatchFinder::MatchCallback { + public: + ObjCPropertyRewriter(SourceRewriter &r, std::string code, std::string key) + : Rewrite(r), InjectCode(code), BindKey(key) {} + + void run(const MatchFinder::MatchResult &Result); + private: + SourceRewriter &Rewrite; + std::string InjectCode; + std::string BindKey; + }; + +} +#endif /* defined(__Foxling__objc_property_rewriter__) */ diff --git a/Foxling/Foxling/Rewriters/prefix_rewriter.cpp b/Foxling/Foxling/Rewriters/prefix_rewriter.cpp new file mode 100644 index 0000000..215ccb6 --- /dev/null +++ b/Foxling/Foxling/Rewriters/prefix_rewriter.cpp @@ -0,0 +1,8 @@ +#include "prefix_rewriter.h" + +void Foxling::prefixTranslationUnit(ASTContext &Context, + Rewriter &Rewrite, + StringRef contentsToInsert) { + SourceLocation loc = Context.getSourceManager().getLocForStartOfFile(Context.getSourceManager().getMainFileID()); + Rewrite.InsertText(loc, contentsToInsert); +} diff --git a/Foxling/Foxling/Rewriters/prefix_rewriter.h b/Foxling/Foxling/Rewriters/prefix_rewriter.h new file mode 100644 index 0000000..ede1b8c --- /dev/null +++ b/Foxling/Foxling/Rewriters/prefix_rewriter.h @@ -0,0 +1,20 @@ +#ifndef __Foxling__prefix_rewriter__ +#define __Foxling__prefix_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +//#include "clang/Rewrite/Core/Rewriter.h" +#include "Rewriter.h" + +namespace Foxling { + + using namespace clang; + using namespace clang::ast_matchers; + + /// Inserts contents to the top of the source + void prefixTranslationUnit(ASTContext &Context, + Rewriter &Rewrite, + StringRef contentsToInsert); +} + +#endif /* defined(__Foxling__prefix_rewriter__) */ diff --git a/Foxling/Foxling/Rewriters/unary_rewriter.cpp b/Foxling/Foxling/Rewriters/unary_rewriter.cpp new file mode 100644 index 0000000..2d0f0cc --- /dev/null +++ b/Foxling/Foxling/Rewriters/unary_rewriter.cpp @@ -0,0 +1,67 @@ +#include "unary_rewriter.h" +#include "clang/AST/ASTContext.h" +#include "llvm/support/Casting.h" +#include "helpers.h" + +using namespace llvm; +using namespace clang; + +bool Foxling::UnaryRewriter::shouldEmitResult(const UnaryOperator *op) const { + auto dynNode = ast_type_traits::DynTypedNode::create(*op); + ArrayRef parentNodes = Context.getParents(dynNode); + for (auto it = parentNodes.begin(); it != parentNodes.end(); it++) { + if (it->get() || it->get() || it->get()) { + return true; + } + } + return false; +} + +void Foxling::UnaryRewriter::run(const MatchFinder::MatchResult &Result) { + if (const UnaryOperator *op = Result.Nodes.getNodeAs(BindKey)) { + // only ++ and -- operators are rewritten + if (op->getOpcode() != UO_PreInc && + op->getOpcode() != UO_PreDec && + op->getOpcode() != UO_PostInc && + op->getOpcode() != UO_PostDec) { + return; + } + auto subexpr = Rewrite.getRewrittenText(op->getSubExpr()->getSourceRange()); + auto operatorStr = op->getOpcodeStr(op->getOpcode()); + + char snapshotExpr[50]; // TODO: allocate memory + if (op->isPostfix()) { + sprintf(snapshotExpr, "__snapshot__%lu%s", (uintptr_t)op, operatorStr.str().c_str()); + } else { + sprintf(snapshotExpr, "%s__snapshot__%lu", operatorStr.str().c_str(), (uintptr_t)op); + } + + char *str; + allocate_sprintf(&str, "({ __typeof(%s) __snapshot__%lu = ", + subexpr.c_str(), + (uintptr_t)op); + Rewrite.InsertText(op->getLocStart(), str); + free(str); + + if (shouldEmitResult(op)) { + allocate_sprintf(&str, + "; %s __typeof(%s) __result__%lu = %s; %s = __snapshot__%lu; __result__%lu; })", + InjectCode.c_str(), + subexpr.c_str(), + (uintptr_t)op, + snapshotExpr, + subexpr.c_str(), + (uintptr_t)op, + (uintptr_t)op); + } else { + allocate_sprintf(&str, "; %s %s; %s = __snapshot__%lu; })", + InjectCode.c_str(), + snapshotExpr, + subexpr.c_str(), + (uintptr_t)op); + } + Rewrite.InsertTextAfterToken(op->getLocEnd(), str); + free(str); + Rewrite.RemoveText(op->getOperatorLoc(), operatorStr.size()); + } +} diff --git a/Foxling/Foxling/Rewriters/unary_rewriter.h b/Foxling/Foxling/Rewriters/unary_rewriter.h new file mode 100644 index 0000000..8471a4b --- /dev/null +++ b/Foxling/Foxling/Rewriters/unary_rewriter.h @@ -0,0 +1,46 @@ +#ifndef __Foxling__unary_rewriter__ +#define __Foxling__unary_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "source_rewriter.h" + +namespace Foxling { + + using namespace clang; + using namespace clang::ast_matchers; + + /// Rewrites unary operators add a yield in between read and writes: + /// ++variable => { + /// __typeof(variable) __a = variable; + /// fthread_yield(); + /// variable = ++__a; + /// } + /// + /// variable++ => { + /// __typeof(variable) __a = variable; + /// fthread_yield(); + /// variable = ++__a; + /// } + /// + /// Does not rewrite constant expressions (eg - ~0x34) or memory-related + /// unary operations (& and *) + /// + /// If the unary is overloaded, we'll have problems... + class UnaryRewriter : public MatchFinder::MatchCallback { + public: + UnaryRewriter(SourceRewriter &r, ASTContext &c, std::string code, std::string key) + : Rewrite(r), Context(c), InjectCode(code), BindKey(key) {} + + void run(const MatchFinder::MatchResult &Result); + protected: + bool shouldEmitResult(const UnaryOperator *op) const; + private: + SourceRewriter &Rewrite; + ASTContext &Context; + std::string InjectCode; + std::string BindKey; + }; +} + +#endif /* defined(__Foxling__unary_rewriter__) */ diff --git a/Foxling/Foxling/helpers.cpp b/Foxling/Foxling/helpers.cpp new file mode 100644 index 0000000..807e1b9 --- /dev/null +++ b/Foxling/Foxling/helpers.cpp @@ -0,0 +1,36 @@ +#include "helpers.h" + +using namespace llvm; + +bool Foxling::isConstantExpression(const Stmt *stmt) { + return (dyn_cast_or_null(stmt) || + dyn_cast_or_null(stmt) || + dyn_cast_or_null(stmt) || + dyn_cast_or_null(stmt) || + dyn_cast_or_null(stmt) || + dyn_cast_or_null(stmt)); +} + +void *Foxling::allocate(size_t size) { + void *ptr = malloc(size); + if (ptr == nullptr) { + fprintf(stderr, "Failed to allocate memory\n"); + abort(); + } + return ptr; +} + +int Foxling::allocate_sprintf(char **ptr, const char *format, ...) { + va_list argsForSize; + va_start(argsForSize, format); + va_list argsForString; + va_copy(argsForString, argsForSize); + size_t size = vsnprintf(NULL, 0, format, argsForSize) + 1; + va_end(argsForSize); + + *ptr = (char *)allocate(size); + int result = vsnprintf(*ptr, size, format, argsForString); + + va_end(argsForString); + return result; +} diff --git a/Foxling/Foxling/helpers.h b/Foxling/Foxling/helpers.h new file mode 100644 index 0000000..8d77bad --- /dev/null +++ b/Foxling/Foxling/helpers.h @@ -0,0 +1,16 @@ +#ifndef __Foxling__helpers__ +#define __Foxling__helpers__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "Rewriter.h" + +namespace Foxling { + /// Returns true if the given Stmt is a constant expression + bool isConstantExpression(const clang::Stmt *stmt); + + void *allocate(size_t size); + int allocate_sprintf(char **ptr, const char *format, ...); +} + +#endif /* defined(__Foxling__helpers__) */ diff --git a/Foxling/Foxling/main.cpp b/Foxling/Foxling/main.cpp new file mode 100644 index 0000000..483d8b2 --- /dev/null +++ b/Foxling/Foxling/main.cpp @@ -0,0 +1,154 @@ +#include +#include + +#include "clang/Frontend/FrontendActions.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Rewrite/Frontend/ASTConsumers.h" +#include "clang/Tooling/CommonOptionsParser.h" +#include "clang/Tooling/Tooling.h" +#include "llvm/Support/CommandLine.h" + +#include "Rewriter.h" +#include "source_rewriter.h" +#include "compound_stmt_rewriter.h" +#include "unary_rewriter.h" +#include "objc_message_rewriter.h" +#include "objc_property_rewriter.h" +#include "objc_matchers.h" +#include "prefix_rewriter.h" + +using namespace clang; +using namespace clang::ast_matchers; +using namespace clang::tooling; +using namespace llvm; + +static llvm::cl::OptionCategory FoxlingTool("foxling options"); +static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage); + +static Foxling::Rewriter rewriter; + +namespace Foxling { + std::string injectCode = "FOXSchedulerYield();"; + std::string cFunctionPrototype = "void FOXSchedulerYield(void);"; + std::string cppFunctionPrototype = "extern \"C\" void FOXSchedulerYield(void);"; + + class PrefixDeclRewriter : public MatchFinder::MatchCallback { + public: + PrefixDeclRewriter(SourceRewriter &r, FileID fileID, int times, std::string prefix, std::string key) + : Rewrite(r), RestrictToFileID(fileID), MaxTimes(times), Count(0), Prefix(prefix), BindKey(key) {} + + void run(const MatchFinder::MatchResult &Result) { + if (const Decl *decl = Result.Nodes.getNodeAs(BindKey)) { + FileID declFileID = Rewrite.getSourceMgr().getFileID(decl->getLocation()); + if (decl->getSourceRange().isValid() && declFileID == RestrictToFileID) { + if (Count < MaxTimes) { + Rewrite.InsertText(decl->getLocStart(), Prefix); + ++Count; + } + } + } + } + private: + SourceRewriter &Rewrite; + FileID RestrictToFileID; + int MaxTimes; + int Count; + std::string Prefix; + std::string BindKey; + }; + + /// "Main" entrypoint for all refactoring operations + /// All the rewriters are wired together here. + class FoxlingASTConsumer : public ASTConsumer { + public: + FoxlingASTConsumer(Rewriter &r) : Rewrite(r) {} + + void HandleTranslationUnit(ASTContext &Context); + private: + Rewriter &Rewrite; + }; + + void FoxlingASTConsumer::HandleTranslationUnit(ASTContext &Context) { + MatchFinder Finder; + + std::string bindKey = "element"; + + SourceRewriter SourceRewrite(Rewrite); + + // Note about rewriters listed here: + // Completely replacing the original AST text for a node will most + // likely cause corruption of the final source output since the + // SourceRewriter can not correctly keep track of changes if an entire + // AST node is removed. + // + // Rewriters should avoid adding new lines whenever possible, + // because it risks confusing users since breakpoints and stacktraces + // will not match the given line. + + CompoundStmtRewriter RewriteCompoundStmt(SourceRewrite, injectCode, bindKey); + Finder.addMatcher(compoundStmt().bind(bindKey), &RewriteCompoundStmt); + + // not as nice as prefixing one protocol definition at the top of the + // file, but this ensures we don't add a new line. + // + // Compiler directives (eg - #import, #include) must start on a line. + std::string functionPrototype = cFunctionPrototype; + if (Context.getLangOpts().CPlusPlus) { + functionPrototype = cppFunctionPrototype; + } + FileID fileID = Rewrite.getSourceMgr().getMainFileID(); + PrefixDeclRewriter PrefixDecl(SourceRewrite, + fileID, + /*times=*/1, + functionPrototype, + bindKey); + Finder.addMatcher(linkageSpecDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(classTemplateSpecializationDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(namespaceDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(usingDirectiveDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(functionDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(recordDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(objCInterfaceDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(objCImplDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(objCCategoryImplDecl().bind(bindKey), &PrefixDecl); + Finder.addMatcher(objCCategoryDecl().bind(bindKey), &PrefixDecl); + + ObjCMessageRewriter RewriteObjCMessage(SourceRewrite, injectCode, bindKey); + Finder.addMatcher(objCMessageExpr().bind(bindKey), &RewriteObjCMessage); + + ObjCPropertyRewriter RewriteObjCProperty(SourceRewrite, injectCode, bindKey); + Finder.addMatcher(objCPropertyRefExpr().bind(bindKey), &RewriteObjCProperty); + + UnaryRewriter RewriteUnary(SourceRewrite, Context, injectCode, bindKey); + Finder.addMatcher(unaryOperator().bind(bindKey), &RewriteUnary); + + Finder.matchAST(Context); + } + + class FrontendAction : public ASTFrontendAction { + public: + virtual std::unique_ptr CreateASTConsumer(CompilerInstance &CI, + StringRef InFile) { + rewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts()); + return std::unique_ptr(new FoxlingASTConsumer(rewriter)); + } + }; + +} + +int main(int argc, const char * argv[]) { + CommonOptionsParser op(argc, argv, llvm::cl::GeneralCategory, NULL); + ClangTool Tool(op.getCompilations(), op.getSourcePathList()); + + int result = Tool.run(newFrontendActionFactory().get()); + if (result) { + return result; + } + + // print final output + rewriter.getEditBuffer(rewriter.getSourceMgr().getMainFileID()).write(outs()); + return result; +} diff --git a/Foxling/Foxling/objc_matchers.h b/Foxling/Foxling/objc_matchers.h new file mode 100644 index 0000000..9c7411e --- /dev/null +++ b/Foxling/Foxling/objc_matchers.h @@ -0,0 +1,24 @@ +#ifndef __Foxling__objc_matchers__ +#define __Foxling__objc_matchers__ + +#include +#include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/AST/AST.h" + +namespace Foxling { + using namespace clang; + using namespace clang::ast_matchers; + + const internal::VariadicDynCastAllOfMatcher objCMessageExpr; + const internal::VariadicDynCastAllOfMatcher objCPropertyRefExpr; + const internal::VariadicDynCastAllOfMatcher objCAtTryStmt; + const internal::VariadicDynCastAllOfMatcher objCAtSynchronizedStmt; + const internal::VariadicDynCastAllOfMatcher objCForCollectionStmt; + const internal::VariadicDynCastAllOfMatcher objCAutoreleasePoolStmt; + const internal::VariadicDynCastAllOfMatcher objCImplDecl; + const internal::VariadicDynCastAllOfMatcher objCCategoryImplDecl; + const internal::VariadicDynCastAllOfMatcher objCInterfaceDecl; + const internal::VariadicDynCastAllOfMatcher objCCategoryDecl; +} + +#endif /* defined(__Foxling__objc_matchers__) */ diff --git a/Foxling/Foxling/source_rewriter.cpp b/Foxling/Foxling/source_rewriter.cpp new file mode 100644 index 0000000..415761e --- /dev/null +++ b/Foxling/Foxling/source_rewriter.cpp @@ -0,0 +1,66 @@ +#include "source_rewriter.h" + +using namespace Foxling; + + +unsigned SourceRewriter::getLocationOffsetAndFileID(SourceLocation Loc, + FileID &FID) const { + assert(Loc.isValid() && "Invalid location"); + std::pair V = Rewrite.getSourceMgr().getDecomposedLoc(Loc); + FID = V.first; + return V.second; +} + +int SourceRewriter::getOffsetToAdjustLoc(SourceLocation Loc) const { + int totalOffset = 0; + for (auto it = Replacements.begin(); it != Replacements.end(); it++) { + unsigned offset = Rewrite.getSourceMgr().getFileOffset(Loc); + unsigned itOffset = Rewrite.getSourceMgr().getFileOffset(it->replaceRange.getEnd()); + if (offset < itOffset) { + int delta = it->getSizeDelta(Rewrite.getSourceMgr()); + totalOffset += delta; + offset += delta; + } + } + return totalOffset; +} + +SourceRange SourceRewriter::getAdjustedRange(SourceRange Range) const { + int offset = getOffsetToAdjustLoc(Range.getBegin()); + SourceLocation adjustedBegin = Range.getBegin().getLocWithOffset(offset); + SourceLocation adjustedEnd = Range.getEnd().getLocWithOffset(offset); + SourceRange adjustedRange(adjustedBegin, adjustedEnd); + return adjustedRange; +} + + +std::string SourceRewriter::getRewrittenText(SourceRange Range) const { + SourceManager &sourceManager = Rewrite.getSourceMgr(); + int rangeBegin = sourceManager.getFileOffset(Range.getBegin()); + int rangeEnd = sourceManager.getFileOffset(Range.getEnd()); + + int start = rangeBegin; + int stop = rangeEnd; + + FileID fileID = sourceManager.getFileID(Range.getBegin()); + + for (auto it = Replacements.begin(); it != Replacements.end(); it++) { + FileID replacementFileID = sourceManager.getFileID(it->replaceRange.getBegin()); + if (it->intersectsRange(Range) && fileID == replacementFileID) { + int begin = sourceManager.getFileOffset(it->replaceRange.getBegin()); + int end = sourceManager.getFileOffset(it->replaceRange.getEnd()); + int newEnd = it->insertedText.size() + begin; + int maxEnd = std::max(end, newEnd); + + // An edit that has occurred before the range + if (begin <= start && start <= maxEnd) { + int delta = (maxEnd - std::min(end, newEnd)); + start += delta; + } else { // An edit that is inside the range + stop += (newEnd - stop); + } + } + } + + return Rewrite.getRewrittenText(Range, start - rangeBegin, stop - rangeEnd); +} diff --git a/Foxling/Foxling/source_rewriter.h b/Foxling/Foxling/source_rewriter.h new file mode 100644 index 0000000..7489b9f --- /dev/null +++ b/Foxling/Foxling/source_rewriter.h @@ -0,0 +1,88 @@ +#ifndef __Foxling__source_rewriter__ +#define __Foxling__source_rewriter__ + +#include "clang/AST/AST.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +//#include "clang/Rewrite/Core/Rewriter.h" +#include "clang/Lex/Lexer.h" +#include +#include +#include +#include "Rewriter.h" + +namespace Foxling { + using namespace clang; + using namespace clang::ast_matchers; + + inline bool operator<=(const SourceLocation &LHS, const SourceLocation &RHS) { + return LHS < RHS || LHS == RHS; + } + + struct ReplacementEntry { + SourceRange replaceRange; + std::string insertedText; + + int getSizeDelta(SourceManager &SourceMgr) const { + unsigned end = SourceMgr.getFileOffset(replaceRange.getEnd()); + unsigned begin = SourceMgr.getFileOffset(replaceRange.getBegin()); + return (int)insertedText.size() - (int)(end - begin); + } + + bool intersectsRange(SourceRange Range) const { + return ((Range.getBegin() <= replaceRange.getBegin() && + replaceRange.getEnd() <= Range.getEnd()) || + (replaceRange.getBegin() <= Range.getBegin() && + Range.getEnd() <= replaceRange.getEnd())); + } + }; + + class SourceRewriter { + std::vector Replacements; + Rewriter &Rewrite; + public: + SourceRewriter(Rewriter &r) : Rewrite(r) {} + + protected: + void recordChange(SourceRange range, StringRef Str) { + Replacements.push_back((ReplacementEntry){range, Str}); + } + + unsigned getLocationOffsetAndFileID(SourceLocation Loc, + FileID &FID) const; + + int getOffsetToAdjustLoc(SourceLocation Loc) const; + + SourceLocation getAdjustedLoc(SourceLocation Loc) const { + return Loc.getLocWithOffset(getOffsetToAdjustLoc(Loc)); + } + + SourceRange getAdjustedRange(SourceRange Range) const; + + public: + std::string getRewrittenText(SourceRange Range) const; + std::string getUnderlyingRewrittenText(SourceRange Range) const { + return Rewrite.getRewrittenText(Range); + } + + SourceManager &getSourceMgr() const { + return Rewrite.getSourceMgr(); + } + + bool RemoveText(SourceLocation Loc, unsigned Length) { + recordChange(SourceRange(Loc, Loc.getLocWithOffset(Length)), ""); + return Rewrite.RemoveText(Loc, Length); + } + + bool InsertText(SourceLocation Loc, StringRef Str) { + recordChange(SourceRange(Loc), Str); + return Rewrite.InsertText(Loc, Str); + } + + bool InsertTextAfterToken(SourceLocation Loc, StringRef Str) { + recordChange(SourceRange(Loc), Str); + return Rewrite.InsertTextAfterToken(Loc, Str); + } + }; +} + +#endif /* defined(__Foxling__source_rewriter__) */ diff --git a/Foxling/LLVM/download_and_build.sh b/Foxling/LLVM/download_and_build.sh new file mode 100755 index 0000000..bad8c32 --- /dev/null +++ b/Foxling/LLVM/download_and_build.sh @@ -0,0 +1,82 @@ +#!/bin/sh + +LLVM_SVN_URL=http://llvm.org/svn/llvm-project/llvm/trunk +CLANG_SVN_URL=http://llvm.org/svn/llvm-project/cfe/trunk +CLANG_TOOLS_EXTRA_SVN_URL=http://llvm.org/svn/llvm-project/clang-tools-extra/trunk +COMPILER_RT_SVN_URL=http://llvm.org/svn/llvm-project/compiler-rt/trunk +LIBCXX_SVN_URL=http://llvm.org/svn/llvm-project/libcxx/trunk +LIBCXX_ABI_SVN_URL=http://llvm.org/svn/llvm-project/libcxxabi/trunk + +VENDOR="Fox" +VENDOR_UTI=net.jeffhui.fox + +GREEN="\x1B[01;92m" +CLEAR="\x1B[0m" + +set -e + +function msg { + printf "$GREEN==>$CLEAR $@\n" +} +function submsg { + printf " $GREEN-->$CLEAR $@\n" +} + +function checkout { + local url=$1 + local dest_dir=$2 + msg "svn checkout $GREEN$url$CLEAR -q" + submsg "destination: $GREEN$dest_dir$CLEAR" + mkdir -p `dirname "$dest_dir"`; true + pushd `dirname "$dest_dir"` + svn co "$url" "`basename "$dest_dir"`" -q + popd +} + +function download_and_extract { + local url=$1 + local dest_dir=$2 + local filename_with_tar_xz=`basename "$url"` + msg "Download & Untar $GREEN$filename_with_tar_xz$CLEAR" + submsg "destination: $GREEN$dest_dir$CLEAR" + pushd `dirname "$dest_dir"` + curl -L "$url" | tar -xJ + mv "${filename_with_tar_xz%.tar.xz}" `basename "$dest_dir"` + popd +} + +msg "Deleting ${GREEN}llvm llvm_build llvm_output$CLEAR" +rm -rf llvm llvm_build llvm_output; true + +msg "Downloading bleeding edge..." +checkout "$LLVM_SVN_URL" llvm +checkout "$CLANG_SVN_URL" llvm/tools/clang +checkout "$CLANG_TOOLS_EXTRA_SVN_URL" llvm/tools/clang/tools/extra +checkout "$COMPILER_RT_SVN_URL" llvm/projects/compiler-rt +checkout "$LIBCXX_SVN_URL" llvm/projects/libcxx +checkout "$LIBCXX_ABI_SVN_URL" llvm/projects/libcxxabi + +mkdir llvm_build + +pushd llvm_build + +msg "Configuring LLVM and Clang" +submsg "Vendor = $GREEN$VENDOR$CLEAR" +submsg "Vendor_UTI = $GREEN$VENDOR_UTI$CLEAR" +cmake ../llvm \ + -DCMAKE_BUILD_TYPE:STRING=Release \ + -DCLANG_BUILD_EXAMPLES:BOOL=ON \ + -DCLANG_PLUGIN_SUPPORT:BOOL=ON \ + -DLLVM_ENABLE_RTTI:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX:STRING=`pwd`/../llvm_output \ + -DCLANG_VENDOR:STRING="$VENDOR" \ + -DCLANG_VENDOR_UTI:STRING="$VENDOR_UTI" \ + -DLLVM_INSTALL_TOOLCHAIN_ONLY:BOOL=ON \ + -DLLVM_ENABLE_LIBCXX:BOOL=ON \ + -DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \ + -DLIBCXX_ENABLE_SHARED:BOOL=OFF + +msg "Compiling LLVM and Clang" +make -j`sysctl -n hw.logicalcpu` + +popd diff --git a/Foxling/LLVM/package.sh b/Foxling/LLVM/package.sh new file mode 100755 index 0000000..275e8b5 --- /dev/null +++ b/Foxling/LLVM/package.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +GREEN="\x1B[01;92m" +CLEAR="\x1B[0m" + +set -e + +function msg { + printf "$GREEN==>$CLEAR $@\n" +} + +msg "Packaging ${GREEN}llvm.tar.gz${CLEAR}" +rm -f llvm.tar.gz || true 2>&1 > /dev/null +tar --exclude '*.svn*' \ + --exclude '*.o' \ + --exclude '*CMakeFiles*' \ + --exclude '*.tmp' \ + --exclude '*.cmake' \ + -zvcf llvm.tar.gz \ + llvm/include \ + llvm/tools/clang/include \ + llvm_build/include \ + llvm_build/lib \ + llvm_build/tools/clang/include + diff --git a/Foxling/LLVM/unpack.sh b/Foxling/LLVM/unpack.sh new file mode 100755 index 0000000..a374365 --- /dev/null +++ b/Foxling/LLVM/unpack.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +GREEN="\x1B[01;92m" +CLEAR="\x1B[0m" + +set -e + +function msg { + printf "$GREEN==>$CLEAR $@\n" +} +function submsg { + printf " $GREEN-->$CLEAR $@\n" +} + +msg "Removing ${GREEN}llvm llvm_build${CLEAR}" +rm -rf llvm llvm_build +if [ ! -f llvm.tar.gz ]; then + URL=http://foxling-clang.jeffhui.net/llvm.tar.gz + msg "Downloading prebuilt LLVM & Clang binaries" + submsg "$URL as llvm.tar.gz" + curl -L $URL > llvm.tar.gz +fi +msg "Unpacking ${GREEN}llvm.tar.gz${CLEAR}" +tar -zxvf llvm.tar.gz + diff --git a/Foxling/bin/Fling b/Foxling/bin/Fling new file mode 100755 index 0000000..ca36a16 --- /dev/null +++ b/Foxling/bin/Fling @@ -0,0 +1,146 @@ +#!/usr/bin/python + +# Wrapper to the Foxling executable to make it a clang-compatible compiler. +# This script assumes it is in the same directory as the Foxling executable. +# +# Since this is argument-compatible to clang. Arguments specific to the +# FoxlingCompiler are given with a prefix of '--foxling-compiler-' +# +# - print-source: Whether or not the FoxlingCompiler should print +# The preprocessed source of the file being compiled. Useful for +# debugging. Defaults to not printing. +# +# - clang: The path of the underlying clang compiler to use. Defaults +# to the clang compiler inside /Applications/Xcode.app's in +# XcodeDefault.xctoolchain. +# - cpp: Indicates a C++ or Objective-C++ file is being compiled. This makes +# Fling call out to clang++ instead of clang. Infers it if the arguments +# provided also specific a c++ stdlib. +# +# Internals: +# The goal roughly this pseudo-bash code: +# +# #!/bin/bash +# ./Foxling $source_file -- $@ > $source_file +# clang $@ +# restore_contents $source_file + +import sys +import os +import tempfile +from distutils.util import strtobool +from subprocess import Popen, PIPE +from argparse import ArgumentParser + +parser = ArgumentParser(description='Wrapping compiler interface to Foxling and Clang') +parser.add_argument('--foxling-compiler-print-source', + dest='DEBUG', + action='store_true', + default=False) +parser.add_argument('--foxling-compiler-clang', + dest='CLANG_EXEC', + action='store', + default='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang') +parser.add_argument('--foxling-compiler-cpp', + dest='IS_CPP', + action='store_true', + default=False) + +foxling_args, args = parser.parse_known_args(sys.argv) + +for arg in args: + if '-stdlib' in arg and 'c++' in arg: + foxling_args.IS_CPP = True + +if foxling_args.IS_CPP: + foxling_args.CLANG_EXEC += '++' + + +# Environment variable indication if we should restore the source file +# to its original source after we preprocess it and compile it. +# +# WARNING: Setting this to false will permanently change the original file. +# But can be useful for debugging generated source. +CLEANUP = strtobool(os.environ.get('FOXLING_CLEANUP', 'true').lower()) +DEBUG = foxling_args.DEBUG +CLANG_EXEC = foxling_args.CLANG_EXEC + +# File extensions that generally indicates a source file +COMPILE_EXTS = [ + 'c', 'cc', 'cpp', 'cp', 'cx', 'cxx', 'c++', 'hpp', 'm', 'mm', +] +# Path to clang executable +CLANG = [CLANG_EXEC] + + +def run(cmd): + """Runs a given command. Fails immediately if it returns a non-zero exit + code. + + Returns a tuple of standard (out, err) of the command executed. + """ + proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) + out, err = proc.communicate() + if proc.returncode == 0: + return out, err + assert False, ('Failed to run "' + ' '.join(cmd) + '"\n\n Output:\n' + + out + '\n\n Error:\n' + err) + + +def find_file_being_compiled(args): + """Returns the file being compiled from the argument list for clang. + """ + for i, arg in enumerate(args): + if os.path.isfile(arg) and arg.split('.')[-1].lower() in COMPILE_EXTS: + return arg + return None + + +def compile(clang_args): + """Runs clang compiler with the given arguments. + """ + run(CLANG + clang_args) + + +def preprocess_and_compile(source_file, clang_args): + """Uses Foxling to preprocess the source before compiling the given file + with clang. + + Properly restores the preprocessed file after compilation completes - even + if it fails. + """ + assert source_file + try: + with open(source_file, 'r') as handle: + original_contents = handle.read() + + args_without_modules = [arg for arg in clang_args if 'module' not in arg] + + foxling_compiler_dir = os.path.dirname(__file__) + foxling_executable = os.path.abspath(os.path.join(foxling_compiler_dir, + './Foxling')) + out, err = run([foxling_executable, source_file, '--'] + + CLANG + args_without_modules) + + if DEBUG: + print >>sys.stderr, '====== Preprocessed Source ======' + print >>sys.stderr, out + print >>sys.stderr, '========= End of Source =========' + + with open(source_file, 'w') as handle: + handle.write(out) + compile(clang_args) + finally: + if CLEANUP: + with open(source_file, 'w') as handle: + handle.write(original_contents) + +args = args[1:] # remove progname +compiling_file = find_file_being_compiled(args) + +if compiling_file: + preprocess_and_compile(compiling_file, args) +else: + print "Not preprocessing" + compile(args) + diff --git a/Foxling/bin/Fling++ b/Foxling/bin/Fling++ new file mode 100755 index 0000000..c80ef3c --- /dev/null +++ b/Foxling/bin/Fling++ @@ -0,0 +1,4 @@ +#!/bin/bash + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +$DIR/FoxlingCompiler --foxling-compiler-cpp $@ diff --git a/README.md b/README.md index 4d1f50b..e961737 100644 --- a/README.md +++ b/README.md @@ -75,17 +75,13 @@ FOXFiniteStateMachine *stateMachine = [[FOXFiniteStateMachine alloc] initWithIni Now, you can generate tests that exercise an API: ```objc -// Generate a sequence of commands executed on the given subject. Since -// this will generate multiple tests, you also give a block of a subject. -id executedCommands = FOXExecuteCommands(stateMachine, ^id { - return [FOXQueue new]; -}); - -// Verify if the executed commands validated the API conformed to the state machine. -FOXRunnerResult *result = [FOXSpecHelper resultForAll:executedCommands - then:^BOOL(NSArray *commands) { - return FOXExecutedSuccessfully(commands); -}]; +// Verify if the series of API calls generated from a state machine +// conformed to the subject (Queue). +FOXAssert(FOXForAll(FOXSerialProgram(stateMachine), ^BOOL(FOXProgram *program) { + Queue *subject = [Queue new]; + FOXExecutedProgram *executedProgram = FOXRunSerialProgram(program, subject); + return FOXReturnOrRaisePrettyProgram(executedProgram); +})); // result will shrinking to the small sequence of API calls to trigger the // failure if there is one ``` @@ -215,6 +211,8 @@ FOXSuchThatWithMaxTries | Returns each generated value iff it satisfies the gi FOXOneOf | Returns generated values by randomly picking from an array of generators. Shrinking is dependent on the generator chosen. FOXForAll | Asserts using the block and a generator and produces test assertion results (FOXPropertyResult). Shrinking tests against smaller values of the given generator. FOXForSome | Like FOXForAll, but allows the assertion block to "skip" potentially invalid test cases. -FOXCommands | Generates arrays of FOXCommands that satisfies a given state machine. -FOXExecuteCommands | Generates arrays of FOXExecutedCommands that satisfies a given state machine and executed against a subject. Can be passed to FOXExecutedSuccessfully to verify if the subject conforms to the state machine. +FOXSerialProgram | Generates FOXProgram (which represents a series of FOXCommands to execute) that satisfies a given state machine specification. +FOXRunSerialProgram | Generates FOXExecutedProgram that satisfies a given state machine and executed against a subject. Can be passed to FOXReturnOrRaisePrettyProgram to verify if the subject conforms to the state machine. +FOXParallelProgram | Generates FOXProgram (which represents a series of parallel FOXCommands to execute) that satisfies a given state machine specification. +FOXRunParallelProgram | Generates FOXExecutedProgram that satisfies a given state machine and executed against a subject. Can be passed to FOXReturnOrRaisePrettyProgram to verify if the subject conforms to the state machine. diff --git a/docs/source/generators_reference.rst b/docs/source/generators_reference.rst index b8d0e82..021c03f 100644 --- a/docs/source/generators_reference.rst +++ b/docs/source/generators_reference.rst @@ -63,7 +63,7 @@ generators shrink to zero: FOXNonZeroInteger() // example generations: -1, 2, -3 -.. c:function:: id FOXChoose(NSNumber *miniumNumber, NSNumber *maximumNumber) // NSNumber +.. c:function:: id FOXChoose(NSNumber *miniumNumber, NSNumber *maximumNumber) Generates random integers boxed as a NSNumber within the given range (inclusive). Shrinks to miniumNumber. The miniumNumber can never be greater @@ -72,7 +72,7 @@ generators shrink to zero: FOXChoose(@5, @10) // example generations: 5, 6, 7 -.. c:function:: id FOXFloat(void) // NSNumber +.. c:function:: id FOXFloat(void) Generates random floating point numbers that conform to the IEEE 754 standard in a boxed NSNumber. Shrinks towards zero by shrinking the float's @@ -85,7 +85,7 @@ generators shrink to zero: It is possible to generate positive infinity and NaNs, but is highly unlikely. -.. c:function:: id FOXDouble(void) // NSNumber +.. c:function:: id FOXDouble(void) Generates random doubles that conform to the IEEE 754 standard in a boxed NSNumber. Shrinks towards zero by shrinking the double's exponent and @@ -98,7 +98,7 @@ generators shrink to zero: It is possible to generate positive infinity and NaNs, but is highly unlikely. -.. c:function:: id FOXDecimalNumber(void) // NSDecimalNumber +.. c:function:: id FOXDecimalNumber(void) Generates random decimal numbers. Shrinks towards zero by shrinking the mantissa and exponent. @@ -214,14 +214,14 @@ generators shrink to zero: FOXDecimalNumber() // example generations: 0, -192000000000000000000000000000000000000000000, 790000000000000000000000000000000000000000000000000000000000000000000000000000 -.. c:function:: id FOXReturn(id value) // id +.. c:function:: id FOXReturn(id value) Generates only the value provided. Does not shrink:: FOXReturn(@2) // example generations: 2 -.. c:function:: id FOXTuple(NSArray *generators) // NSArray +.. c:function:: id FOXTuple(NSArray *generators) Generates a fixed-size arrays where each element corresponds to each of the generators provided:: @@ -232,7 +232,7 @@ generators shrink to zero: Shrinking is the smallest value for each of the generators provided. The array does not change size. -.. c:function:: id FOXTupleOfGenerators(id *generators) // NSArray +.. c:function:: id FOXTupleOfGenerators(id *generators) Identical to ``FOXTuple``, but accepts a FOXSequence of generators instead of an array:: @@ -241,7 +241,7 @@ generators shrink to zero: FOXTupleOfGenerators(@[FOXInteger(), FOXDecimalNumber()]); // example generations: @[@0, @0], @[@2, @-129] -.. c:function:: id FOXArray(id itemGenerator) // NSArray +.. c:function:: id FOXArray(id itemGenerator) Generates a variable-sized array where each element is created via the itemGenerator. Shrinking reduces the size of the array as well as each @@ -250,7 +250,7 @@ generators shrink to zero: FOXArrayOfSize(FOXInteger(), 3) // example generations: @[@0, @0, @0], @[@2, @-129, @21] -.. c:function:: id FOXArrayOfSize(id itemGenerator, NSUInteger size) // NSArray +.. c:function:: id FOXArrayOfSize(id itemGenerator, NSUInteger size) Generates a fixed-size array where each element is created via the itemGenerator. Shrinking only reduces the size of each element generated:: @@ -259,7 +259,7 @@ generators shrink to zero: FOXArrayOfSize(FOXInteger(), 3) // example generations: @[@0, @0, @0], @[@2, @-129, @21] -.. c:function:: id FOXArrayOfSizeRange(id itemGenerator, NSUInteger minSize, NSUInteger maxSize) // NSArray +.. c:function:: id FOXArrayOfSizeRange(id itemGenerator, NSUInteger minSize, NSUInteger maxSize) Generates a variable-sized array where each element is created via the itemGenerator. The size of the array is within the specified range @@ -270,7 +270,7 @@ generators shrink to zero: FOXArrayOfSizeRange(FOXInteger(), 1, 2) // example generations: @[@0], @[@2, @-129] -.. c:function:: id FOXDictionary(NSDictionary *template) // NSDictionary +.. c:function:: id FOXDictionary(NSDictionary *template) Generates random dictionaries of generated values. Keys are known values ahead of time. Specified in `@{: }` form:: @@ -282,7 +282,7 @@ generators shrink to zero: Only values shrink. The number of pairs the dictionary holds does not shrink. -.. c:function:: id FOXSet(id generator) // NSSet +.. c:function:: id FOXSet(id generator) Generates random sets of generated values. The size of the set is not deterministic. Values generated should support the methods required to be @@ -292,7 +292,7 @@ generators shrink to zero: FOXSet(FOXInteger()) // example generations: [NSSet setWithObject:@1], [NSSet setWithObjects:@3, @2, nil] -.. c:function:: id FOXCharacter(void) // NSString +.. c:function:: id FOXCharacter(void) Generates random 1-length sized character string. It may be an unprintable character. Shrinks to smaller ascii numeric values:: @@ -300,7 +300,7 @@ generators shrink to zero: FOXCharacter() // example generations: @"\0", @"f", @"k" -.. c:function:: id FOXAlphabeticalCharacter(void) // NSString +.. c:function:: id FOXAlphabeticalCharacter(void) Generates random 1-length sized alphabetical string. Includes both upper and lower case. Shrinks to smaller ascii numeric values:: @@ -308,7 +308,7 @@ generators shrink to zero: FOXAlphabeticalCharacter() // example generations: @"A", @"a", @"k" -.. c:function:: id FOXNumericCharacter(void) // NSString +.. c:function:: id FOXNumericCharacter(void) Generates random 1-length sized numeric string (0-9). Shrinks to smaller ascii numeric values:: @@ -316,7 +316,7 @@ generators shrink to zero: FOXNumericCharacter() // example generations: @"0", @"1", @"9" -.. c:function:: id FOXAlphanumericCharacter(void) // NSString +.. c:function:: id FOXAlphanumericCharacter(void) Generates random 1-length sized numeric string (A-Z,a-z,0-9). Shrinks to smaller ascii numeric values:: @@ -324,7 +324,7 @@ generators shrink to zero: FOXAlphanumericCharacter() // example generations: @"A", @"d", @"7" -.. c:function:: id FOXAsciiCharacter(void) // NSString +.. c:function:: id FOXAsciiCharacter(void) Generates random 1-length sized character string. It is ensured to be printable. Shrinks to smaller ascii numeric values:: @@ -332,7 +332,7 @@ generators shrink to zero: FOXAsciiCharacter() // example generations: @"A", @"d", @"7", @"%" -.. c:function:: id FOXString(void) // NSString +.. c:function:: id FOXString(void) Generates random variable length strings. It may be an unprintable string. Shrinks to smaller ascii numeric values and smaller length strings:: @@ -340,7 +340,7 @@ generators shrink to zero: FOXString() // example generations: @"", @"fo$#@52\n\0", @"sfa453" -.. c:function:: id FOXStringOfLength(NSUInteger length) // NSString +.. c:function:: id FOXStringOfLength(NSUInteger length) Generates random fixed-length strings. It may be an unprintable string. Shrinks to smaller ascii numeric values and smaller length strings:: @@ -348,7 +348,7 @@ generators shrink to zero: FOXStringOfLength(5) // example generations: @"fdg j", @"f#%2\0", @"23zzf" -.. c:function:: id FOXStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) // NSString +.. c:function:: id FOXStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) Generates random variable length strings within the given range (inclusive). It may be an unprintable string. Shrinks to smaller ascii @@ -357,7 +357,7 @@ generators shrink to zero: FOXStringOfLengthRange(3, 5) // example generations: @"fgsj", @"b 2", @"65a\n\0" -.. c:function:: id FOXAsciiString(void) // NSString +.. c:function:: id FOXAsciiString(void) Generates random variable length ascii-only strings. Shrinks to smaller ascii numeric values and smaller length strings:: @@ -365,7 +365,7 @@ generators shrink to zero: FOXAsciiString() // example generations: @"fgsj", @"b 2", @"65a" -.. c:function:: id FOXAsciiStringOfLength(NSUInteger length) // NSString +.. c:function:: id FOXAsciiStringOfLength(NSUInteger length) Generates random fixed-length ascii-only strings. Shrinks to smaller ascii numeric values and smaller length strings:: @@ -373,7 +373,7 @@ generators shrink to zero: FOXAsciiStringOfLength(5) // example generations: @"fgsj1", @"b 122", @"65abb" -.. c:function:: id FOXAsciiStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) // NSString +.. c:function:: id FOXAsciiStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) Generates random variable length ascii-only strings within the given range (inclusive). Shrinks to smaller ascii numeric values and smaller length @@ -382,7 +382,7 @@ generators shrink to zero: FOXAsciiStringOfLengthRange(2, 5) // example generations: @"fg", @" 122", @"abb" -.. c:function:: id FOXAlphabeticalString(void) // NSString +.. c:function:: id FOXAlphabeticalString(void) Generates random variable length alphabetical strings. Includes upper and lower cased strings. Shrinks to smaller ascii numeric values and smaller @@ -391,7 +391,7 @@ generators shrink to zero: FOXAlphabeticalString() // example generations: @"fg", @"admm", @"oiuteoer" -.. c:function:: id FOXAlphabeticalStringOfLength(NSUInteger length) // NSString +.. c:function:: id FOXAlphabeticalStringOfLength(NSUInteger length) Generates random fixed-length alphabetical strings. Includes upper and lower cased letters. Shrinks to smaller ascii numeric values and smaller @@ -400,7 +400,7 @@ generators shrink to zero: FOXAlphabeticalStringOfLength(4) // example generations: @"fguu", @"admm", @"ueer" -.. c:function:: id FOXAlphabeticalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) // NSString +.. c:function:: id FOXAlphabeticalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) Generates random variable length alphabetical strings within the given range (inclusive). Includes upper and lower cased strings. Shrinks to @@ -409,7 +409,7 @@ generators shrink to zero: FOXAlphabeticalStringOfLengthRange(2, 4) // example generations: @"fguu", @"adm", @"ee" -.. c:function:: id FOXAlphanumericalString(void) // NSString +.. c:function:: id FOXAlphanumericalString(void) Generates random variable length alphanumeric strings. Includes upper and lower cased strings. Shrinks to smaller ascii numeric values and smaller @@ -418,7 +418,7 @@ generators shrink to zero: FOXAlphanumericalString() // example generations: @"fg9u", @"a3M", @"fkljlkbd3241ee" -.. c:function:: id FOXAlphanumericalStringOfLength(NSUInteger length) // NSString +.. c:function:: id FOXAlphanumericalStringOfLength(NSUInteger length) Generates random fixed-length alphanumeric strings. Includes upper and lower cased letters. Shrinks to smaller ascii numeric values and smaller @@ -427,7 +427,7 @@ generators shrink to zero: FOXAlphanumericalStringOfLength(3) // example generations: @"fg9", @"a3M", @"1ee" -.. c:function:: id FOXAlphanumericalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) // NSString +.. c:function:: id FOXAlphanumericalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) Generates random variable length alphanumeric strings within the given range (inclusive). Includes upper and lower cased strings. Shrinks to @@ -436,7 +436,7 @@ generators shrink to zero: FOXAlphanumericalStringOfLengthRange(2, 3) // example generations: @"fg9", @"aM", @"1e" -.. c:function:: id FOXNumericalString(void) // NSString +.. c:function:: id FOXNumericalString(void) Generates random variable length numeric strings (0-9). Includes upper and lower cased strings. Shrinks to smaller ascii numeric values and smaller @@ -445,7 +445,7 @@ generators shrink to zero: FOXNumericalString() // example generations: @"", @"62", @"0913024" -.. c:function:: id FOXNumericalStringOfLength(NSUInteger length) // NSString +.. c:function:: id FOXNumericalStringOfLength(NSUInteger length) Generates random fixed-length numeric strings (0-9). Includes upper and lower cased letters. Shrinks to smaller ascii numeric values and smaller @@ -454,7 +454,7 @@ generators shrink to zero: FOXNumericalStringOfLength(3) // example generations: @"521", @"620", @"091" -.. c:function:: id FOXNumericalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) // NSString +.. c:function:: id FOXNumericalStringOfLengthRange(NSUInteger minLength, NSUInteger maxLength) Generates random variable length numeric strings (0-9) within the given range (inclusive). Includes upper and lower cased strings. Shrinks to @@ -470,7 +470,7 @@ generators shrink to zero: FOXElements(@[@1, @5, @9]); // example generations: @1, @5, @9 -.. c:function:: id FOXSimpleType(void) // id +.. c:function:: id FOXSimpleType(void) Generates random simple types. A simple type is a data type that is not made of other types. The value generated may not be safe to print to @@ -485,7 +485,7 @@ generators shrink to zero: But this generator may change to cover more data types at any time. -.. c:function:: id FOXPrintableSimpleType(void) // id +.. c:function:: id FOXPrintableSimpleType(void) Generates random simple types. A simple type is a data type that is not made of other types. The value generated is ensured to be printable to @@ -500,7 +500,7 @@ generators shrink to zero: But this generator may change to cover more data types at any time. -.. c:function:: id FOXCompositeType(id itemGenerator) // id +.. c:function:: id FOXCompositeType(id itemGenerator) Generates random composite types. A composite type contains other data types. Elements of the composite type are from the provided itemGenerator.. @@ -513,7 +513,7 @@ generators shrink to zero: But this generator may change to cover more data types at any time. -.. c:function:: id FOXAnyObject(void) // id +.. c:function:: id FOXAnyObject(void) Generates random simple or composite types. Shrinking is dependent on the type generated. @@ -525,7 +525,7 @@ generators shrink to zero: But this generator may change to cover more data types at any time. -.. c:function:: id FOXAnyPrintableObject(void) // id +.. c:function:: id FOXAnyPrintableObject(void) Generates random printable simple or composite types. Shrinking is dependent on the type generated. @@ -537,11 +537,11 @@ generators shrink to zero: But this generator may change to cover more data types at any time. -Computation Generators ----------------------- +Combinators +----------- Also, you can compose some computation work on top of data generators. The resulting -generator adopts the same shrinking properties as the original generator. +generator usually adopts the same shrinking properties as the original generator. .. c:function:: id FOXMap(id generator, id(^fn)(id generatedValue)) @@ -557,21 +557,19 @@ generator adopts the same shrinking properties as the original generator. Applies a block to the value that the original generator generates. The block is expected to return a new generator. Shrinking is dependent on the - returned generator. This is a way to create a new generator from the input + original generator. This is a way to create a new generator from the input of another generator's value:: // create a generator that produces arrays of random capacities - // does not shrink because of FOXReturn's generator behavior. + // Shinks as value does (towards zero). FOXBind(FOXPositiveInteger(), ^id(NSNumber *value) { return FOXReturn([NSArray arrayWithCapacity:[value integerValue]]); }); .. c:function:: id FOXResize(id generator, NSUInteger newSize) - Overrides the given generator's size parameter with the specified size. - Prevents shrinking:: + Overrides the given generator's size parameter with the specified size:: - // Similar to FOXArrayOfSizeRange(FOXInteger(), @0, @10) FOXResize(FOXArray(FOXInteger()), 10); .. c:function:: id FOXOptional(id generator) @@ -619,11 +617,11 @@ generator adopts the same shrinking properties as the original generator. return [value integerValue] % 2 == 0; }); -.. warning:: Using ``FOXSuchThat`` and ``FOXSuchThatWithMaxTries`` are "filter" - generators and can lead to significant waste in test generation by - Fox. While it gives you the most flexibility the kind of generated - data, it is the most computationally expensive. Use other - generators when possible. + .. warning:: Using ``FOXSuchThat`` and ``FOXSuchThatWithMaxTries`` are "filter" + generators and can lead to significant waste in test generation by + Fox. While this gives you the most flexibility the kind of + generated data, it is the most computationally expensive. + Instead, use other combinators when possible. .. c:function:: id FOXSuchThatWithMaxTries(id generator, BOOL(^predicate)(id generatedValue), NSUInteger maxTries) @@ -636,11 +634,11 @@ generator adopts the same shrinking properties as the original generator. return [value integerValue] % 10 == 0; }); -.. warning:: Using ``FOXSuchThat`` and ``FOXSuchThatWithMaxTries`` are "filter" - generators and can lead to significant waste in test generation by - Fox. While it gives you the most flexibility the kind of generated - data, it is the most computationally expensive. Use other - generators when possible. + .. warning:: Using ``FOXSuchThat`` and ``FOXSuchThatWithMaxTries`` are "filter" + generators and can lead to significant waste in test generation by + Fox. While this gives you the most flexibility the kind of + generated data, it is the most computationally expensive. + Instead, use other combinators when possible. .. c:function:: id FOXOneOf(NSArray *generators) @@ -679,9 +677,14 @@ generator adopts the same shrinking properties as the original generator. }); // example generations: , , -.. c:function:: id FOXCommands(id stateMachine) +.. c:function:: id FOXCommands(id stateMachine) + + Generates arrays of FOXExecuteCommands that satisfies a given state + machine. Can be passed to FOXExecutedSuccessfully to verify if the subject + conforms to the state machine. - Generates arrays of FOXCommands that satisfies a given state machine. + .. note:: It's recommended to use FOXSerialProgram instead. FOXCommands + may be deprecated and removed at a later date. .. c:function:: id FOXExecuteCommands(id stateMachine) @@ -690,6 +693,117 @@ generator adopts the same shrinking properties as the original generator. FOXExecutedSuccessfully to verify if the subject conforms to the state machine. + .. note:: It's recommended to use FOXRunSerialProgram instead. + FOXExecuteCommands may be deprecated and removed at a later date. + +.. c:function:: id FOXSerialProgram(id stateMachine) + + .. warning:: Currently ALPHA - subject to change at any point + + Generates a FOXProgram that conforms to a given state machine. A program is + an abstract representation of a series of API calls (FOXCommands) to invoke. + + Use :c:func:`FOXRunSerialProgram` to executed a FOXProgram and + :c:func:`FOXReturnOrRaisePrettyProgram` to verify the executed program:: + + FORForAll(FOXSerialProgram(stateMachine), ^BOOL(FOXProgram *program) { + Queue *subject = [Queue new]; + FOXExecutedProgram *executedProgram = FOXRunSerialProgram(program, subject); + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + Shrinking removes irrelevant commands to provoke the failure. Do not + intermix serial commands with parallel commands. + +.. c:function:: id FOXParallelProgram(id stateMachine) + + .. warning:: Currently ALPHA - subject to change at any point + + Generates a FOXProgram that conforms to a given state machine. A program is + an abstract representation of a series of parallel API calls (FOXCommands) + to invoke. Each state transition for the state machine should be atomic. + + This verifies `linearizability`_ of the subject under test. + + Use :c:func:`FOXRunParallelProgram` to executed the FOXProgram on multiple threads + and :c:func:`FOXReturnOrRaisePrettyProgram` to verify the executed program:: + + // Warning: Shrinking is non-deterministic due to its parallel nature. + FORForAll(FOXParallelProgram(stateMachine), ^BOOL(FOXProgram *program) { + FOXExecutedProgram *executedProgram = FOXRunParallelProgram(program, ^id { + return [Queue new]; + }); + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + Shrinking removes irrelevant commands to provoke the failure. Do not + intermix serial commands with parallel commands. + + .. warning:: Due to the non-deterministic nature of parallel code, Fox cannot + reliably shrink a failing example to the smallest counter example + when only using FOXParallelProgram(). + + FOXScheduler and Foxling can help serialize thread execution to be more + deterministic, **but may still not reach optimal shrinking**:: + + // Warning: this code should be compiled with the Foxling compiler + id programs = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + FORForAll(programs, ^BOOL(NSArray *tuple) { + FOXProgram *program = tuple[0]; + id prng = tuple[1]; + + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:prng]; + __block FOXExecutedProgram *executedProgram = nil; + [executedProgram runAndWait:^{ + executedProgram = FOXRunParallelProgram(program, ^id { + return [Queue new]; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + }); + + Read more about :doc:`parallel testing ` for limitations + and quirks. + +.. _linearizability: http://en.wikipedia.org/wiki/Linearizability + +Helper Functions +---------------- + +Helper functions used in conjunction with existing generators. + +.. c:function:: FOXExecutedProgram *FOXRunSerialProgram(FOXProgram *program, id subject) + + .. warning:: Currently ALPHA - subject to change at any point + + Executes a given serial program and records its results in the returned + FOXExecutedProgram. + + Use `FOXReturnOrRaisePrettyProgram`:c:func: to verify the executed program. + +.. c:function:: FOXExecutedProgram *FOXRunParallelProgram(FOXProgram *program, id(^subjectFactory)()) + + .. warning:: Currently ALPHA - subject to change at any point + + Executes a given parallel program and records its results in the returned + FOXExecutedProgram. The block argument produces a new instance of the + subject under test. + + Use `FOXReturnOrRaisePrettyProgram`:c:func: to verify the executed program. + +.. c:function:: BOOL FOXReturnOrRaisePrettyProgram(FOXExecutedProgram *program) + + .. warning:: Currently ALPHA - subject to change at any point + + Verifies the executed program and returns ``YES`` if the program executed + in line with the state machine. Raises a control-flow exception to pass + executed program results to assist in printing return values when executing + commands. + + .. note:: While raising exceptions are not ideal for an API, this may change when a major + API refactor occurs (2.x.x). + .. _Debugging Functions: Debugging Functions @@ -697,20 +811,33 @@ Debugging Functions Fox comes with a handful of functions that can help you diagnose generator problems. -.. c:function:: id FOXSample(id generator) +.. c:function:: NSArray *FOXSample(id generator) - Samples 10 values that generator produces. + Samples 10 values that a generator produces. Useful to see kind of values + the given generator produces:: -.. c:function:: id FOXSampleWithCount(id generator, NSUInteger numberOfSamples) + FOXSample(FOXInteger()); // @[@1, @93, @54, @32, @17, @23, @55, @5, @9, @33] - Samples a number of values that a generator produces. +.. c:function:: NSArray *FOXSampleWithCount(id generator, NSUInteger numberOfSamples) -.. c:function:: id FOXSampleShrinking(id generator) + Samples a number of values that a generator produces. Useful to see kind of + values the given generator produces:: + + FOXSampleWithCount(FOXInteger(), 2); // @[@42, @12]; + +.. c:function:: NSArray *FOXSampleShrinking(id generator) Samples 10 steps of shrinking from a value that a generator produces. + Useful to see how a generator will shrink a given value. The first value is + always the originally generated value:: -.. c:function:: id FOXSampleShrinkingWithCount(id generator, NSUInteger numberOfSamples) + FOXSampleShrinking(FOXInteger()); // @[@4, @0, @2, @3, @0, @1, @0, @1, @2, @0]; + +.. c:function:: NSArray *FOXSampleShrinkingWithCount(id generator, NSUInteger numberOfSamples) Samples a number of steps of shrinking from a value that a generator - produces. + produces. Useful to see how a generator will shrink a given value. The + first value is always the originally generated value:: + + FOXSampleShrinkingWithCount(FOXInteger(), 4); // @[@4, @0, @2, @3]; diff --git a/docs/source/images/xcode-compiler-setting.png b/docs/source/images/xcode-compiler-setting.png new file mode 100644 index 0000000..591a625 Binary files /dev/null and b/docs/source/images/xcode-compiler-setting.png differ diff --git a/docs/source/index.rst b/docs/source/index.rst index 96b14d6..ebda96a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,10 +1,13 @@ Fox Documentation ================= -Everything about Fox, the property-based testing tool for Objective-C. +Everything about Fox, the property-based testing tool for Objective-C and +Swift. Besides this documentation, you can also view the `source on GitHub`_. +.. TODO - write/update docs to use swift code. + .. _source on GitHub: https://github.com/jeffh/Fox Getting Started @@ -12,9 +15,9 @@ Getting Started New to Fox? Or just wanting to have a taste of it? Start here. -- :doc:`Overview ` - What is Fox? -- :doc:`Installation ` - How to get set up. -- :doc:`Tutorial ` - Get a feel for using Fox. +- :doc:`Overview ` - What is Fox? How is it different from other unit testing frameworks? +- :doc:`Installing Fox ` - How to get set up to use Fox. +- :doc:`Basic Tutorial ` - Get a feel for using Fox. Generators ---------- @@ -22,20 +25,35 @@ Generators Generators are semi-random data producers that are the core to Fox's capabilities. Follow the links below to learn more in detail. -- :doc:`Overview ` -- :doc:`Built-in Generators Reference ` -- :ref:`Building Custom Generators` -- :ref:`Building Generators with Custom Shrinking` +- :doc:`Overview ` - What are generators? +- :doc:`Built-in Generators Reference ` - What generators does fox provide? +- :ref:`Building Custom Generators` - How do you build your own generators? +- :ref:`Building Generators with Custom Shrinking` - How do you customize how generators shrink values it generates? The Runner ---------- All the guts around configuring and executing Fox's verification of properties. -- :doc:`Overview ` -- :ref:`Configuring Test Generation` -- :ref:`Random Number Generators` -- :ref:`Reporters` +- :doc:`Overview ` - How Fox runs properties and generators. +- :ref:`Configuring Test Generation` - How to customize how Fox generates tests. +- :ref:`Random Number Generators` - The abstraction Fox uses to control random number generation. +- :ref:`Reporters` - The abstraction Fox uses to report test results. + +Parallel Testing +---------------- + +.. warning:: This section and its API is ALPHA and is subject to change. + Alpha APIs are **not** under :ref:`semantic versioning + ` and can change freely between versions. + +How to use Fox to test stateful code that executes in parallel (across multiple +threads). This *does not encompass async testing*. + +- :doc:`Installing the Foxling Compiler ` - How to install Fox's Compiler for parallel testing. +- :doc:`Parallel Testing Tutorial ` - A run-through of parallel testing in Fox. +- :doc:`Fox's Thread Scheduler ` - Technical details of Fox's cooperative threads runtime. +- :doc:`Foxling Compiler ` - Technical details of Fox's cooperative threads compiler. .. TODO - While useful. This is definitely less valuable to write for now. .. Other Topics @@ -63,10 +81,15 @@ All the guts around configuring and executing Fox's verification of properties. :maxdepth: 2 What is Fox? - Installation - Tutorial + Installing Fox + Installing Foxling + Basic Tutorial Generators The Runner & Test Generation + Parallel Testing Tutorial (Alpha) + Fox's Thread Scheduler (Alpha) + The Foxling Compiler (Alpha) + Built-in Generators Reference diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 7ab69ac..2a0c8e6 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -6,10 +6,16 @@ Installation Fox can be installed in multiple ways. If you don't have a preference, install via git submodule. +.. _semantic-versioning: + Fox honors `semantic versioning` as humanly possible. If you're unsure if a given update is backwards incompatible with your usage. Check out the `releases`_. +.. note:: APIs marked as ALPHA are not under semantic versioning and are + subject to changes between versions. The entire Swift API is + currently ALPHA. + .. _semantic versioning: http://semver.org .. _releases: https://github.com/jeffh/Fox/releases @@ -28,22 +34,31 @@ If you don't want bleeding edge, check out the particular tag of the version:: Add ``Fox.xcodeproj`` to your Xcode project (not ``Fox.xcworkspace``). Then link Fox-iOS or Fox-OSX to your test target. -And you're all set up! Dive right in by following the :doc:`tutorial -`. +And you're all set up to get started. Dive right in by following the +:doc:`tutorial `. + +If you're interested in advanced parallel testing, you may want to install the +:doc:`Foxling compiler `. CocoaPods --------- +Use cocoapods 0.36.0, which has Swift support. Install using ``gem install +cocoapods --pre``. + Add to your Podfile for you test target to have the latest stable version of Fox:: - pod 'Fox', '~>1.0.1' + pod 'Fox', '~>1.0.0' And then ``pod install``. And you're all set up! Dive right in by following the :doc:`tutorial `. +If you're interested in advanced parallel testing, you may want to install the +:doc:`Foxling compiler `. + Carthage -------- diff --git a/docs/source/parallel/compiler.rst b/docs/source/parallel/compiler.rst new file mode 100644 index 0000000..bcbafeb --- /dev/null +++ b/docs/source/parallel/compiler.rst @@ -0,0 +1,150 @@ +.. highlight:: objective-c + +Foxling Compiler +================ + +.. warning:: This documentation and API is ALPHA and is subject to change. + Alpha APIs are **not** under :ref:`semantic versioning + ` and can change freely between versions. + +Foxling is a custom compiler which automatically inserts cooperative yield +statements in the code it compiles. This is to support testing parallel code +with :doc:`Fox's thread scheduler `. + +Foxling consists mostly as a preprocessor to Apple's Clang (which is different +to the open-sourced Clang). It's actually consists of several (mostly internal) +components: + +- **Foxling** - the preprocessor; Implemented as a Clang LibTool. +- **Fling** - the wrapper that combines the preprocessor and Apple's Clang together +- **Fling++** - the wrapper that combines the preprocessor and Apple's Clang++ together +- **Foxling Compiler** - the Xcode Plugin Bundle used for installation. + +The Xcode Plugin will tell Xcode to run ``Fling``. + +Rewrite Rules for Objective-C +----------------------------- + +The Foxling preprocessor uses the open source Clang's C++ API to read ASTs and +rewrite them. Note that the source transformation examples are for +demonstrative purposes. **You should not rely on the implementation details of +the rewritten source**. + +Before each statement in a C-block. + Every statement inside ``{ }`` gets a yield inserted before it. + + Original source:: + + - (void)method { + printSomething(); + for (; true ;) { + return 1 + 1; + } + } + + After Foxling preprocesses:: + + - (void)method { + FOXSchedulerYield(); + printSomething(); + FOXSchedulerYield(); + for (; true ;) { + FOXSchedulerYield(); + return 1 + 1; + } + } + +Between read and write operations of (``++``/``--``) unary operators. + Unaries are expanded to include a yield while preserving the context which + they execute in. + + Original source:: + + - (int)method { + other_var--; + return ++variable; + } + + After Foxling preprocesses:: + + // note, variable names are mangled more than shown + - (int)method { + ({ + __typeof(variable) v = variable; + FOXSchedulerYield(); + v--; + variable = v; + }); + return ({ + __typeof(variable) v = variable; + FOXSchedulerYield(); + __typeof(variable) r = ++v; + variable = v; + r; + }); + } + +Between objective-c message send calls and computing the receiver. + Since receivers can also be expressions, yields are inserted. + + Original source:: + + - (int)method { + other_var--; + return ++variable; + } + + After Foxling preprocesses:: + + // note, variable names are mangled more than shown + - (int)method { + ({ + __typeof(variable) v = variable; + FOXSchedulerYield(); + v--; + variable = v; + }); + return ({ + __typeof(variable) v = variable; + FOXSchedulerYield(); + __typeof(variable) r = ++v; + variable = v; + r; + }); + } + +Before setting a property value, but after computing the property's intended value. + This effectively yields between computation (and potential reads) and writing. + + Original source:: + + - (int)method { + self.variable = 2; + } + + After Foxling preprocesses:: + + // note, variable names are mangled more than shown + - (int)method { + self.variable = ({ + __typeof(2) v = 2; + FOXSchedulerYield(); + v; + }); + } + +Foxling preserves line numbers, so all the preprocessed source are actually on +a single line. + +.. warning:: Foxling does not operated on expressions inside macros. This means + that any potential rewrite rules inside macros are not rewritten. + +Rewrite Rules for Swift +----------------------- + +Unfortunately, Swift's Clang extension isn't opened source for direct AST +access. Using SourceKit may be a possibility, but at this point in time, +Foxling cannot rewrite Swift code. + +You can track this issue here. + diff --git a/docs/source/parallel/installation.rst b/docs/source/parallel/installation.rst new file mode 100644 index 0000000..c0b0889 --- /dev/null +++ b/docs/source/parallel/installation.rst @@ -0,0 +1,44 @@ +.. highlight:: objective-c + +Installing the Foxling Compiler +=============================== + +Foxling is a custom compiler built on top of `LLVM`_ and `Clang`_ to provide +implicit cooperative scheduling. It is used in conjunction with :doc:`Fox's +Cooperative Thread Scheduler ` to make parallel code more +deterministic. + +.. _LLVM: http://llvm.org +.. _Clang: http://clang.llvm.org + +Alcatraz +-------- + +.. If you have `Alcatraz`_, you can install Foxling (Not really, it's a TODO). + +Currently, Foxling must be compiled from source or downloaded as a pre-built +binary. See issue. + +.. _Alcatraz: http://alcatraz.io + +Installing a Prebuilt Binary +---------------------------- + +TODO + +Compiling from Source +--------------------- + +Open ``Fox.xcworkspace`` and build the ``Foxling Compiler`` scheme. +By default, Foxling will automatically download a prebuilt clang snapshot for +use. After building that scheme, just restart Xcode for the plugin to be +installed. + +If you prefer to manually download and build clang from source, run +``Foxling/LLVM/download_and_build.sh`` within the ``Foxling/LLVM`` directory, +which follows the directs outlined on `LLVM's site`_. Afterwards, build the +``Foxling Compiler`` scheme. The target will use clang pulled from source +instead of downloading and using the precompiled version. + +.. _LLVM's site: http://clang.llvm.org/get_started.html + diff --git a/docs/source/parallel/scheduler.rst b/docs/source/parallel/scheduler.rst new file mode 100644 index 0000000..fe86f1a --- /dev/null +++ b/docs/source/parallel/scheduler.rst @@ -0,0 +1,129 @@ +.. highlight:: objective-c + +Fox's Thread Scheduler +====================== + +.. warning:: This documentation and API is ALPHA and is subject to change. + Alpha APIs are **not** under :ref:`semantic versioning + ` and can change freely between versions. + +This covers more technical details of Fox's thread scheduler. While not +essential to know, reading this can provide insight to potential quirks of the +implementation. + +Overview +-------- + +Fox's scheduling system has two goals: be easily injectable to existing code, +and to control thread execution order. It implements a pthread-like interface +by relying mostly on the system pthreads implementation. There are specific +functions that have custom implementations: + +- thread creation and destruction to track threads. +- locks and mutexes to be cooperatively scheduled. +- fox-specific APIs to control thread execution (yielding, scheduling, etc.) + +Then, `mach_override`_ is used to replace pthread methods. Currently, the +following functions can be assumed to be overridden (although, it may not always): + +- pthread functions (threads, mutexes, cond variables) +- POSIX semaphores (that are not deprecated by OS X or iOS) +- Mach semaphores +- OSSpinLock + +These overrides are global for the entire process. That means libraries will +also trigger Fox's custom code when hooks take place. If you find apis that +should be supported `file an issue`_. + +Currently, **Fox's function replacement is permanent**. A flag is set +internally to trigger the original code or Fox's custom code. While this detail +is minor, it has a possibility of creating differences in execution time and +preemptive scheduling when not using Fox's scheduler. + +.. note:: Using Fox does not override usage of explicit kernel threads. + +.. _file an issue: http://github.com/jeffh/Fox/issues +.. _mach_override: https://github.com/rentzsch/mach_override + +.. _FOXScheduler: + +Using the Scheduler +------------------- + +The public API of Fox's scheduler is purposefully kept small. ``FOXScheduler`` +is the public interface to Fox's C scheduler. Let's look at the methods:: + + @interface FOXScheduler : NSObject + + - (instancetype)initWithRandom:(id)random; + - (instancetype)initWithRandom:(id)random + replaceSystemFunctions:(BOOL)replaceThreads; + - (void)runAndWait:(void(^)())block; + + @end + +``-[initWithRandom:]`` is recommended to use the majority of the time. It +simply calls through to ``-[initWithRandom:random replaceSystemFunctions:YES]``. +Random is used for indirectly dictating the ordering of threads for the +scheduler to run. + +When ``replaceSystemFunctions`` is ``YES``, then Fox will use mach_override to +replace the system functions. Using ``NO`` will require manually cooperation for +threads **and locks**. + +Use ``-[runAndWait:]`` to activate Fox's scheduler for the given block. The +method will block until all the threads finishes executing. Note that +``runAndWait:`` only captures threads inside the block. This can be problematic +for GCD queues, which can create threads. + +In order for cooperative scheduling to work properly, +:c:func:`FOXSchedulerYield` needs to be calls throughout all the threads to +"mark" break points. + +Due to implementation reasons of ``NSThread``, the scheduler cannot force a +thread to yield immediately. Instead, manually insert an explicit yield to +pause a thread at startup:: + + NSThread *thread = [[NSThread alloc] initWithTarget:myObject + selector:@selector(run) + object:nil]; + [thread start]; + + // implementation of run + - (void)run { + FOXSchedulerYield(); + // do work. + } + +Not doing this will cause threads to run in parallel immediately. +:c:func:`FOXRunParallelProgram` does this automatically. + +Cooperative Scheduling +---------------------- + +Fox's threading implementation is a `user-level`, `cooperatively scheduled`_ +library. **User-level** means it's not implemented in terms of the OS. +**Cooperatively scheduled** means threads must explicitly yield execution to +another thread (unlike normal threads which get preemptively yielded by the +scheduler). + +Preemptive scheduling is complex for programs - usually require `complex signal +handling`_ for some basic reliability and does not allow Fox to retain full +execution control. + +.. _user-level: http://cs.stackexchange.com/questions/1065/what-is-the-difference-between-user-level-threads-and-kernel-level-threads +.. _cooperatively scheduled: http://en.wikipedia.org/wiki/Thread_(computing)#Scheduling +.. _complex signal handling: https://mikeash.com/pyblog/friday-qa-2011-04-01-signal-handling.html + +Fox's threads aren't particularly useful for anything other than testing. +In fact, they're actually *slower* that normal thread or serial execution. + +Fox's threading library "serializes" all thread execution (like event-IO or +fiber libraries). Fox can control the order of execution of threads with a +custom thread scheduler. This gives more control to help make parallel tests +more deterministic. + +Of course, Fox's scheduler works hand-in-hand with :doc:`the Foxling Compiler +` to avoid having to manually insert thread yields (which is very +error-prone). + diff --git a/docs/source/parallel/tutorial.rst b/docs/source/parallel/tutorial.rst new file mode 100644 index 0000000..6546722 --- /dev/null +++ b/docs/source/parallel/tutorial.rst @@ -0,0 +1,210 @@ +.. highlight:: objective-c + +Parallel Testing Tutorial +========================= + +.. warning:: This documentation and API is ALPHA and is subject to change. + Alpha APIs are **not** under :ref:`semantic versioning + ` and can change freely between versions. + +.. note:: **This tutorial does not cover asynchronous testing.** Async testing + is a different feature and requires specifying a temporal model that + Fox currently does not implement. + +If you haven't already, :doc:`install the Foxling Compiler Plugin +` before continuing. + +The Multithreading Problem Space +--------------------------------- + +Parallel testing is more difficult than standard testing. + +There are many factors that threading code can experience: + +- **Atomic**: Multiple threads access the same resource but may access stale data and critical sections. +- **Reordering**: Compiled or executed code can be reordered by the OS or CPU in comparison to the original source. +- **Race Conditions**: behavior of the code changes depending on how the OS or language runtime executes each thread. +- **Partial read/writes**: data can be partially read or written before being preempted to run another thread. +- **Deadlocks**: Multiple threads block for resources (locks) that each other thread is holding. +- **Starvation**: Certain threads get less or no execution time in comparison to other threads due to locking or scheduling. + +Fox cannot cover all these scenarios, but can help find bugs some cases. + +Fox's Solution +-------------- + +Fox relies on :ref:`state machine ` infrastructure to +test parallel APIs. The state machine is assumed to be atomic against multiple +threads using the subject's API. + +To help control the non-deterministic nature of parallel code, Fox can +optionally replace `pthreads`_ and some darwin APIs with a cooperative threads +implementation. Along with :doc:`Foxling `, Fox can greatly increase +the likelihood of finding hard-to-find race conditions that may be hard to +detect with traditional unit testing. + +.. _memory barrier: http://en.wikipedia.org/wiki/Memory_barrier +.. _pthreads: http://en.wikipedia.org/wiki/POSIX_Threads + +Fox supports testing via :ref:`state machines `. Simply +replace all the ``Serial`` API calls with ``Parallel``:: + + // generate an arbitrary sequence of API calls that execute in parallel + id programs = FOXParallelProgram(stateMachine); + // verify that all the executed commands properly conformed to the state machine. + FOXAssert(FOXForAll(programs, ^BOOL(FOXProgram *program) { + FOXExecutedProgram *executedProgram = FOXRunParallelProgram(program, ^id{ + Queue *subject = [Queue new]; + return subject; + }); + return FOXReturnOrRaisePrettyProgram(executedProgram); + })); + +Limited Parallel Execution +-------------------------- + +Program generation for parallel testing is greatly limited in execution +permutation. Fox creates parallel programs by creating a serial command prefix +to enter a random state before executing the parallel test: + +- In **1** to **3** threads +- with **1** to **2** commands per thread + +While seemingly small, `a study seems to indicate`_ that parallel tests can be +relatively small to exhibit common failures: + +- A partial ordering of 2 threads caused a failure (96% of 105 real-world programs) +- A particular ordering of four memory accesses (92% of 105 real-world programs) + +Fox and QuickCheck take this assumption with its testing strategy. **Fox +cannot gaurantee thread-safety**, but can detect many common errors. + +.. _a study seems to indicate: http://www.cs.columbia.edu/~junfeng/09fa-e6998/papers/concurrency-bugs.pdf + +Deterministic Non-Determinism +----------------------------- + +Running the above code will reveal a problem inherit with parallel tests, +they're non-deterministic! This makes it difficult for Fox to shrink a failing +test case because it cannot reliably tell if a smaller example will also fail +when running in parallel. + +A naive solution is to simply rerun test cases. :c:func:`FOXAlways` can help +that, but that's an ugly hack to try and get around that problem. + +What we really need is to *control* the order in when threads are executed. Fox +can do this with :ref:`FOXScheduler `. This is an interface to a +`user-level`_, `cooperatively scheduled`_ threading library. + +.. _user-level: http://cs.stackexchange.com/questions/1065/what-is-the-difference-between-user-level-threads-and-kernel-level-threads +.. _cooperatively scheduled: http://en.wikipedia.org/wiki/Thread_(computing)#Scheduling + +Along with overriding existing `pthreads`_ with Fox's own threading library at +runtime, Fox can hijack other systems that use pthreads internally - such as +``NSThread``. + +.. _pthreads: http://en.wikipedia.org/wiki/POSIX_Threads + +There's one caveat. Since it's cooperatively threading, **threads must +explicitly yield execution control to the scheduler** in order to switch +between threads. That is, :c:func:`FOXSchedulerYield` must be inserted into all +the code under test to allow the scheduler to control permutations of thread +execution. Don't worry, we'll come back around and address this issue. + +The scheduler can be accessed via :ref:`FOXScheduler `:: + + id random = [[FOXDeterministicRandom alloc] init]; + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + [scheduler runAndWait:^{ + // create and use threads + }]; + +Notice that the scheduler requires a random number generator. The number +generator indirectly dictates thread execution order. The block for +``runAndWait:`` should create and run threads. The scheduler will automatically +wait until no threads can be executed before returning. + +.. warning:: Because GCD creates threads ahead of time, ``FOXScheduler`` cannot + currently control GCD queues. + +:c:func:`FOXRunParallelProgram` internally uses NSThreads, which uses pthreads in +turn. So we'll put that in the block and use :c:func:`FOXSeed` to generate a +random number generator:: + + // generate an arbitrary sequence of API calls that execute in parallel + // along with a random number generator + id tuples = FOXTuple(@[FOXParallelProgram(stateMachine), + FOXSeed()]); + FOXAssert(FOXForAll(tuples, ^BOOL(NSArray *tuple) { + FOXProgram *program = tuple[0]; + id random = tuple[1]; + + FOXScheduler *scheduler = [[FOXScheduler alloc] initWithRandom:random]; + __block FOXExecutedProgram *executedProgram = nil; + [scheduler runAndWait:^{ + executedProgram = FOXRunParallelProgram(program, ^id{ + Queue *subject = [Queue new]; + return subject; + }); + }]; + return FOXReturnOrRaisePrettyProgram(executedProgram); + })); + +:c:func:`FOXRunParallelProgram` does some cooperatively yielding by calling +:c:func:`FOXSchedulerYield`. Not yielding makes the scheduler view blocks of code +as atomic. That's not what we want our Queue's code that we're testing. +However, manually adding yield statements is time-consuming and error-prone. +The better solution is to have a program do this for us... + +Foxling, The Compiler +--------------------- + +Fox comes with its own compiler, call :doc:`Foxling `. It's based off +of Clang and its only job is to automatically insert ``FOXSchedulerYield();`` +statements at compile time. + +Psst, now would be a great time to :doc:`install the Foxling Xcode Plugin +` if you haven't by now. + +It's recommended to create a new targets for your application and parallel +tests to utilize the Foxling compiler. It should be idential to your original +targets except for setting: + +.. image:: /images/xcode-compiler-setting.png + +Which is available after the plugin is installed. THe last thing is to make +sure Fox is linked to both your application and tests to ensure the compiler +can correctly link to ``FOXSchedulerYield()``. + +Now compiling will automatically insert yields into our source! + +Final Caveats +------------- + +It's worth noting that **Foxling can only insert yields for code it compiles**. +This means that libraries that aren't compiled with Foxling behave atomically +unless otherwise noted by Fox's threading library. + +Since Foxling calls through to Apple's Clang (which has proprietary extensions +to the open-sourced Clang), compiling with Foxling can be significantly slower +since it's parsing source twice. + +Finding parallel bugs in your program can be greatly affected by when yields +are inserted into your program. Foxling currently only inserts yields: + +- before each statement in a C-block (every statement ends with a ``;`` + inside ``{ }``). +- between read and write operations of (``++``/``--``) unary operators. +- between objective-c message send calls and computing the receiver. +- before setting a property value, but after computing the property's intended + value. + +Also, Foxling currently cannot parse Swift code and is untested on C++ code. + +While the scheduler can significantly shrink the number of commands execute, it +currently cannot fully minimize its shrinking. + +If you're more interested in the technical details of parallel testing inside +Fox, read about the :doc:`Fox's thread scheduler ` or :doc:`Foxling +Compiler `. + diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 4f5eb02..3a18970 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -207,6 +207,8 @@ happens to be significant. elements for the sort example. See :ref:`Configuring Test Generation` for more information. +.. _Testing Stateful APIs: + Testing Stateful APIs --------------------- @@ -288,13 +290,13 @@ We can translate the diagram into code by configuring a }; [stateMachine addTransition:removeTransition]; - // generate and execute an arbitrary sequence of API calls - id executedCommands = FOXExecuteCommands(stateMachine, ^id{ - return [[Queue alloc] init]; - }); + // generate an arbitrary sequence of API calls + id programs = FOXSerialProgram(stateMachine); // verify that all the executed commands properly conformed to the state machine. - FOXAssert(FOXForAll(executedCommands, ^BOOL(NSArray *commands) { - return FOXExecutedSuccessfully(commands); + FOXAssert(FOXForAll(programs, ^BOOL(FOXProgram *program) { + Queue *subject = [Queue new]; + FOXExecutedProgram *executedProgram = FOXRunSerialProgram(program, subject); + return FOXReturnOrRaisePrettyProgram(executedProgram); })); } diff --git a/test b/test index 66cc4c3..185be36 100755 --- a/test +++ b/test @@ -10,6 +10,8 @@ BUILD_OSX_SDK_VERSION=${FOX_BUILD_OSX_SDK_VERSION:-$LATEST_OSX_SDK_VERSION} PROJECT_NAME='Fox.xcworkspace' IOS_SCHEME=Fox-iOS OSX_SCHEME=Fox-OSX +FOXLING_COMPILER_SCHEME='Foxling Compiler' +OSX_SPECS_APP_SCHEME=Fox-OSX-Specs set -e @@ -68,9 +70,38 @@ function test_osx { build test } +function podspec_lint() { + pod spec lint Fox.podspec +} + +function build_foxling() { + pushd Foxling/LLVM + ./unpack.sh + popd + run xcodebuild -workspace "$PROJECT_NAME"\ + -scheme "$FOXLING_COMPILER_SCHEME"\ + -configuration "Debug"\ + clean build +} + +function test_foxling() { + rm -rf build; true + build_foxling + run xcodebuild -workspace "$PROJECT_NAME"\ + -scheme "$OSX_SPECS_APP_SCHEME"\ + -configuration "Debug"\ + -sdk "macosx$BUILD_OSX_SDK_VERSION"\ + clean build \ + SYMROOT=`pwd`/build + pushd build/Debug + DYLD_FRAMEWORK_PATH=`pwd` ./$OSX_SPECS_APP_SCHEME + popd +} + function test() { test_ios test_osx + test_foxling } function clean { @@ -81,12 +112,14 @@ function help { echo "Usage: $0 COMMANDS" echo echo "COMMANDS:" - echo " clean - Cleans the derived data directory of Xcode. Assumes default location" - echo " ios - Runs the tests as an iOS device" - echo " osx - Runs the tests on Mac OS X 10.10 (Yosemite and newer only)" - echo " all - Runs the OS X and iOS tests" - echo " test - Runs the OS X and iOS tests" - echo " help - Displays this help" + echo " clean - Cleans the derived data directory of Xcode. Assumes default location" + echo " ios - Runs the tests as an iOS device" + echo " osx - Runs the tests on Mac OS X 10.10 (Yosemite and newer only)" + echo " foxling - Runs OS X tests with Foxling Compiler." + echo " build_foxling - Builds and installs the Foxling Compiler." + echo " all - Runs the OS X and iOS tests" + echo " test - Runs the OS X and iOS tests" + echo " help - Displays this help" echo exit 1 } @@ -99,6 +132,9 @@ function main { clean) clean ;; ios) test_ios ;; osx) test_osx ;; + foxling) test_foxling ;; + build_foxling) build_foxling ;; + podspec) podspec_lint ;; test) test ;; all) test ;; help) help ;;