diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/editing/DebuggerStateEditingPluginIntegrationTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/editing/DebuggerStateEditingPluginIntegrationTest.java index d4be04f87d..a2051b465e 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/editing/DebuggerStateEditingPluginIntegrationTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/editing/DebuggerStateEditingPluginIntegrationTest.java @@ -105,14 +105,14 @@ public class DebuggerStateEditingPluginIntegrationTest extends AbstractGhidraHea assertTrue( helper.patchInstructionAction.isAddToPopup(listingProvider.getActionContext(null))); Instruction ins = - helper.patchInstructionAt(tb.addr(0x00400123), "imm r0,#0x0", "imm r0,#1234"); + helper.patchInstructionAt(tb.addr(0x00400123), "imm r0,#0x0", "imm r0,#0x3d2"); assertEquals(2, ins.getLength()); long snap = traceManager.getCurrent().getViewSnap(); assertTrue(DBTraceUtils.isScratch(snap)); byte[] bytes = new byte[2]; view.getMemory().getBytes(tb.addr(0x00400123), bytes); - assertArrayEquals(tb.arr(0x40, 1234), bytes); + assertArrayEquals(tb.arr(0x30, 0xd2), bytes); } @Test diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/pcode/DebuggerPcodeStepperProviderTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/pcode/DebuggerPcodeStepperProviderTest.java index d231126178..f2e332e935 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/pcode/DebuggerPcodeStepperProviderTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/pcode/DebuggerPcodeStepperProviderTest.java @@ -86,8 +86,8 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg Assembler asm = Assemblers.getAssembler(tb.trace.getFixedProgramView(0)); iit = asm.assemble(start, - "imm r0, #1234", - "imm r1, #2045"); // 11 bits unsigned + "imm r0, #0x3d2", + "imm r1, #911"); // 10 bits unsigned } imm1234 = iit.next(); diff --git a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/BytesTracePcodeEmulatorTest.java b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/BytesTracePcodeEmulatorTest.java index 5e75c61640..253aa1b6ee 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/BytesTracePcodeEmulatorTest.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/BytesTracePcodeEmulatorTest.java @@ -246,7 +246,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest "pc = 0x00400000;", "sp = 0x00110000;"), List.of( - "imm r0, #1234")); // decimal + "imm r0, #911")); // decimal BytesTracePcodeEmulator emu = new BytesTracePcodeEmulator(tb.trace, 0); PcodeThread emuThread = emu.newThread(thread.getPath()); @@ -261,7 +261,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest TraceSleighUtils.evaluate("sp", tb.trace, 1, thread, 0)); assertEquals(BigInteger.valueOf(0x00400002), TraceSleighUtils.evaluate("pc", tb.trace, 1, thread, 0)); - assertEquals(BigInteger.valueOf(1234), + assertEquals(BigInteger.valueOf(911), TraceSleighUtils.evaluate("r0", tb.trace, 1, thread, 0)); } } @@ -278,9 +278,9 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest "sp = 0x00110000;"), List.of( "brds 0x00400006", - "imm r0, #1234", // decimal - "imm r0, #2020", - "imm r1, #2021")); + "imm r0, #911", // decimal + "imm r0, #860", + "imm r1, #861")); BytesTracePcodeEmulator emu = new BytesTracePcodeEmulator(tb.trace, 0); PcodeThread emuThread = emu.newThread(thread.getPath()); @@ -294,9 +294,9 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest assertEquals(BigInteger.valueOf(0x00400008), TraceSleighUtils.evaluate("pc", tb.trace, 1, thread, 0)); - assertEquals(BigInteger.valueOf(1234), + assertEquals(BigInteger.valueOf(911), TraceSleighUtils.evaluate("r0", tb.trace, 1, thread, 0)); - assertEquals(BigInteger.valueOf(2021), + assertEquals(BigInteger.valueOf(861), TraceSleighUtils.evaluate("r1", tb.trace, 1, thread, 0)); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/pcode/AbstractPcodeFormatter.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/pcode/AbstractPcodeFormatter.java index fd51a8fb93..b09254dccf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/pcode/AbstractPcodeFormatter.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/pcode/AbstractPcodeFormatter.java @@ -176,6 +176,9 @@ public abstract class AbstractPcodeFormatter> else if (offset.getType() == ConstTpl.J_NEXT) { appender.appendLabel("inst_next"); } + else if (offset.getType() == ConstTpl.J_NEXT2) { + appender.appendLabel("inst_next2"); + } else { formatAddress(appender, null, offset, size); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/test/ToyProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/test/ToyProgramBuilder.java index 00ce20c00f..261bf44e37 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/test/ToyProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/test/ToyProgramBuilder.java @@ -494,6 +494,27 @@ public class ToyProgramBuilder extends ProgramBuilder { addInstructionWords(address, (short) (0xe000 | (relDest << 4))); // breq rel } + /** + * Add conditional skip (consumes 2-bytes) + * @param offset instruction address offset + * @throws MemoryAccessException + */ + public void addBytesSkipConditional(long offset) + throws MemoryAccessException { + addBytesSkipConditional(toHex(offset)); + } + + /** + * Add conditional skip (consumes 2-bytes) + * @param addr instruction address + * @throws MemoryAccessException + */ + public void addBytesSkipConditional(String addr) + throws MemoryAccessException { + Address address = addr(addr); + addInstructionWords(address, (short) (0x8000)); // skeq + } + /** * Add branch w/ delay slot (consumes 4-bytes) * @param offset instruction address offset diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/assembler/AssemblerPluginTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/assembler/AssemblerPluginTest.java index a7a5fba626..6f5e22fe6a 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/assembler/AssemblerPluginTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/plugin/core/assembler/AssemblerPluginTest.java @@ -15,7 +15,7 @@ */ package ghidra.app.plugin.core.assembler; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import org.junit.*; @@ -90,8 +90,8 @@ public class AssemblerPluginTest extends AbstractGhidraHeadedIntegrationTest { @Test public void testActionPatchInstructionNoExisting() throws Exception { Address address = space.getAddress(0x00400000); - Instruction ins = helper.patchInstructionAt(address, "", "imm r0, #1234"); - assertEquals("imm r0,#0x4d2", ins.toString()); + Instruction ins = helper.patchInstructionAt(address, "", "imm r0, #911"); + assertEquals("imm r0,#0x38f", ins.toString()); } @Test @@ -99,11 +99,11 @@ public class AssemblerPluginTest extends AbstractGhidraHeadedIntegrationTest { Address address = space.getAddress(0x00400000); Assembler asm = Assemblers.getAssembler(program); try (ProgramTransaction trans = ProgramTransaction.open(program, "Assemble pre-existing")) { - asm.assemble(address, "imm r0,#0x4d2"); + asm.assemble(address, "imm r0,#0x3d2"); trans.commit(); } - Instruction ins = helper.patchInstructionAt(address, "imm r0,#0x4d2", "imm r0, #123"); + Instruction ins = helper.patchInstructionAt(address, "imm r0,#0x3d2", "imm r0, #123"); assertEquals("imm r0,#0x7b", ins.toString()); } diff --git a/Ghidra/Features/Decompiler/certification.manifest b/Ghidra/Features/Decompiler/certification.manifest index e78fc73dc1..1d94dfc743 100644 --- a/Ghidra/Features/Decompiler/certification.manifest +++ b/Ghidra/Features/Decompiler/certification.manifest @@ -41,6 +41,7 @@ src/decompile/datatests/pointersub.xml||GHIDRA||||END| src/decompile/datatests/promotecompare.xml||GHIDRA||||END| src/decompile/datatests/readvolatile.xml||GHIDRA||||END| src/decompile/datatests/sbyte.xml||GHIDRA||||END| +src/decompile/datatests/skipnext2.xml||GHIDRA||||END| src/decompile/datatests/statuscmp.xml||GHIDRA||||END| src/decompile/datatests/threedim.xml||GHIDRA||||END| src/decompile/datatests/twodim.xml||GHIDRA||||END| diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/context.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/context.cc index d1acbb1649..51157f3a7c 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/context.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/context.cc @@ -17,11 +17,12 @@ #include "slghsymbol.hh" #include "translate.hh" -ParserContext::ParserContext(ContextCache *ccache) +ParserContext::ParserContext(ContextCache *ccache,Translate *trans) { - parsestate = 0; + parsestate = uninitialized; contcache = ccache; + translate = trans; if (ccache != (ContextCache *)0) { contextsize = ccache->getDatabase()->getContextSize(); context = new uintm[ contextsize ]; @@ -43,6 +44,18 @@ void ParserContext::initialize(int4 maxstate,int4 maxparam,AddrSpace *spc) base_state = &state[0]; } +const Address &ParserContext::getN2addr(void) const + +{ + if (n2addr.isInvalid()) { + if (translate == (Translate *)0 || parsestate == uninitialized) + throw LowlevelError("inst_next2 not available in this context"); + int4 length = translate->instructionLength(naddr); + n2addr = naddr + length; + } + return n2addr; +} + uintm ParserContext::getInstructionBytes(int4 bytestart,int4 size,uint4 off) const { // Get bytes from the instruction stream into a intm diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/context.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/context.hh index 3372e5ac55..8ae7012a69 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/context.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/context.hh @@ -64,6 +64,7 @@ struct ContextSet { // Instructions for setting a global context value class ParserWalker; // Forward declaration class ParserWalkerChange; +class Translate; class ParserContext { friend class ParserWalker; @@ -75,6 +76,7 @@ public: pcode = 2 // Instruction is parsed in preparation for generating p-code }; private: + Translate *translate; // Instruction parser int4 parsestate; AddrSpace *const_space; uint1 buf[16]; // Buffer of bytes in the instruction stream @@ -84,13 +86,14 @@ private: vector contextcommit; Address addr; // Address of start of instruction Address naddr; // Address of next instruction + mutable Address n2addr; // Address of instruction after the next Address calladdr; // For injections, this is the address of the call being overridden vector state; // Current resolved instruction ConstructState *base_state; int4 alloc; // Number of ConstructState's allocated int4 delayslot; // delayslot depth public: - ParserContext(ContextCache *ccache); + ParserContext(ContextCache *ccache,Translate *trans); ~ParserContext(void) { if (context != (uintm *)0) delete [] context; } uint1 *getBuffer(void) { return buf; } void initialize(int4 maxstate,int4 maxparam,AddrSpace *spc); @@ -98,7 +101,7 @@ public: void setParserState(int4 st) { parsestate = st; } void deallocateState(ParserWalkerChange &walker); void allocateOperand(int4 i,ParserWalkerChange &walker); - void setAddr(const Address &ad) { addr = ad; } + void setAddr(const Address &ad) { addr = ad; n2addr = Address(); } void setNaddr(const Address &ad) { naddr = ad; } void setCalladdr(const Address &ad) { calladdr = ad; } void addCommit(TripleSymbol *sym,int4 num,uintm mask,bool flow,ConstructState *point); @@ -106,6 +109,7 @@ public: void applyCommits(void); const Address &getAddr(void) const { return addr; } const Address &getNaddr(void) const { return naddr; } + const Address &getN2addr(void) const; const Address &getDestAddr(void) const { return calladdr; } const Address &getRefAddr(void) const { return calladdr; } AddrSpace *getCurSpace(void) const { return addr.getSpace(); } @@ -147,6 +151,7 @@ public: AddrSpace *getConstSpace(void) const { return const_context->getConstSpace(); } const Address &getAddr(void) const { if (cross_context != (const ParserContext *)0) { return cross_context->getAddr(); } return const_context->getAddr(); } const Address &getNaddr(void) const { if (cross_context != (const ParserContext *)0) { return cross_context->getNaddr();} return const_context->getNaddr(); } + const Address &getN2addr(void) const { if (cross_context != (const ParserContext *)0) { return cross_context->getN2addr();} return const_context->getN2addr(); } const Address &getRefAddr(void) const { if (cross_context != (const ParserContext *)0) { return cross_context->getRefAddr();} return const_context->getRefAddr(); } const Address &getDestAddr(void) const { if (cross_context != (const ParserContext *)0) { return cross_context->getDestAddr();} return const_context->getDestAddr(); } int4 getLength(void) const { return const_context->getLength(); } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.cc index 02229662d5..f187cdd571 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.cc @@ -791,7 +791,7 @@ void Funcdata::doLiveInject(InjectPayload *payload,const Address &addr,BlockBasi emitter.setFuncdata(this); context.clear(); - context.baseaddr = addr; // Shouldn't be using inst_next and inst_start here + context.baseaddr = addr; // Shouldn't be using inst_next, inst_next2 or inst_start here context.nextaddr = addr; list::const_iterator deaditer = obank.endDead(); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/inject_sleigh.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/inject_sleigh.cc index 0229f4ba9b..e37e3f4695 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/inject_sleigh.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/inject_sleigh.cc @@ -333,7 +333,7 @@ void PcodeInjectLibrarySleigh::parseInject(InjectPayload *payload) throw LowlevelError("Registering pcode snippet before language is instantiated"); } if (contextCache.pos == (ParserContext *)0) { // Make sure we have a context - contextCache.pos = new ParserContext((ContextCache *)0); + contextCache.pos = new ParserContext((ContextCache *)0,(Translate *)0); contextCache.pos->initialize(8,8,slgh->getConstantSpace()); } PcodeSnippet compiler(slgh); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeinject.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeinject.hh index 86821b222e..d57215bc7c 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeinject.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeinject.hh @@ -69,6 +69,7 @@ public: /// concrete Varnodes. This class contains the context dependent data to resolve: /// - inst_start -- the address where the injection occurs /// - inst_next -- the address of the instruction following (the instruction being injected) +/// - inst_next2 -- the address of the instruction after the next instruction (Not Supported) /// - inst_dest -- Original destination of CALL being injected /// - inst_ref -- Target of reference on injected instruction /// - \ -- Input Varnode of the injection referenced by name diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.cc index 1b3236d101..c562c0f834 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.cc @@ -75,17 +75,17 @@ /* Substitute the variable and function names. */ -#define yyparse pcodeparseparse -#define yylex pcodeparselex -#define yyerror pcodeparseerror -#define yydebug pcodeparsedebug -#define yynerrs pcodeparsenerrs +#define yyparse pcodeparse +#define yylex pcodelex +#define yyerror pcodeerror +#define yydebug pcodedebug +#define yynerrs pcodenerrs -#define yylval pcodeparselval -#define yychar pcodeparsechar +#define yylval pcodelval +#define yychar pcodechar /* Copy the first part of user declarations. */ -#line 16 "src/decompile/cpp/pcodeparse.y" /* yacc.c:339 */ +#line 16 "pcodeparse.y" /* yacc.c:339 */ #include "pcodeparse.hh" @@ -95,7 +95,7 @@ extern int yydebug; extern int yyerror(const char *str ); -#line 84 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:339 */ +#line 84 "pcodeparse.cc" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -119,7 +119,7 @@ # define YYDEBUG 0 #endif #if YYDEBUG -extern int pcodeparsedebug; +extern int pcodedebug; #endif /* Token type. */ @@ -184,7 +184,8 @@ extern int pcodeparsedebug; OPERANDSYM = 312, STARTSYM = 313, ENDSYM = 314, - LABELSYM = 315 + NEXT2SYM = 315, + LABELSYM = 316 }; #endif @@ -193,7 +194,7 @@ extern int pcodeparsedebug; union YYSTYPE { -#line 26 "src/decompile/cpp/pcodeparse.y" /* yacc.c:355 */ +#line 26 "pcodeparse.y" /* yacc.c:355 */ uintb *i; string *str; @@ -209,11 +210,12 @@ union YYSTYPE LabelSymbol *labelsym; StartSymbol *startsym; EndSymbol *endsym; + Next2Symbol *next2sym; OperandSymbol *operandsym; VarnodeSymbol *varsym; SpecificSymbol *specsym; -#line 202 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:355 */ +#line 204 "pcodeparse.cc" /* yacc.c:355 */ }; typedef union YYSTYPE YYSTYPE; @@ -222,15 +224,15 @@ typedef union YYSTYPE YYSTYPE; #endif -extern YYSTYPE pcodeparselval; +extern YYSTYPE pcodelval; -int pcodeparseparse (void); +int pcodeparse (void); /* Copy the second part of user declarations. */ -#line 219 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:358 */ +#line 221 "pcodeparse.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -472,21 +474,21 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1919 +#define YYLAST 1968 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 81 +#define YYNTOKENS 82 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 13 /* YYNRULES -- Number of rules. */ -#define YYNRULES 118 +#define YYNRULES 120 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 296 +#define YYNSTATES 298 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 315 +#define YYMAXUTOK 316 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -499,12 +501,12 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 40, 2, 2, 2, 35, 9, 2, - 76, 77, 33, 29, 79, 30, 2, 34, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 74, 7, - 14, 75, 15, 2, 2, 2, 2, 2, 2, 2, + 77, 78, 33, 29, 80, 30, 2, 34, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 75, 7, + 14, 76, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 78, 2, 80, 8, 2, 2, 2, 2, 2, + 2, 79, 2, 81, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 41, 2, 2, 2, @@ -526,25 +528,26 @@ static const yytype_uint8 yytranslate[] = 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73 + 68, 69, 70, 71, 72, 73, 74 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 100, 100, 102, 103, 104, 105, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 191, - 192, 193, 194, 196, 197, 198, 199, 200, 201, 202, - 204, 205, 206, 208, 209, 210, 211, 212, 214, 215, - 217, 218, 220, 221, 222, 223, 225, 226, 227 + 0, 102, 102, 104, 105, 106, 107, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 193, + 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, + 205, 207, 208, 209, 211, 212, 213, 214, 215, 217, + 218, 220, 221, 223, 224, 225, 226, 227, 229, 230, + 231 }; #endif @@ -565,9 +568,9 @@ static const char *const yytname[] = "OP_ROUND", "OP_INT2FLOAT", "OP_FLOAT2FLOAT", "OP_TRUNC", "OP_NEW", "BADINTEGER", "GOTO_KEY", "CALL_KEY", "RETURN_KEY", "IF_KEY", "ENDOFSTREAM", "LOCAL_KEY", "INTEGER", "STRING", "SPACESYM", "USEROPSYM", - "VARSYM", "OPERANDSYM", "STARTSYM", "ENDSYM", "LABELSYM", "':'", "'='", - "'('", "')'", "'['", "','", "']'", "$accept", "rtl", "rtlmid", - "statement", "expr", "sizedstar", "jumpdest", "varnode", + "VARSYM", "OPERANDSYM", "STARTSYM", "ENDSYM", "NEXT2SYM", "LABELSYM", + "':'", "'='", "'('", "')'", "'['", "','", "']'", "$accept", "rtl", + "rtlmid", "statement", "expr", "sizedstar", "jumpdest", "varnode", "integervarnode", "lhsvarnode", "label", "specificsymbol", "paramlist", YY_NULLPTR }; #endif @@ -584,55 +587,55 @@ static const yytype_uint16 yytoknum[] = 33, 126, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 58, 61, 40, 41, 91, 44, - 93 + 312, 313, 314, 315, 316, 58, 61, 40, 41, 91, + 44, 93 }; # endif -#define YYPACT_NINF -67 +#define YYPACT_NINF -68 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-67))) + (!!((Yystate) == (-68))) -#define YYTABLE_NINF -110 +#define YYTABLE_NINF -111 #define yytable_value_is_error(Yytable_value) \ - (!!((Yytable_value) == (-110))) + (!!((Yytable_value) == (-111))) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { - -67, 9, 203, -67, -2, -39, -43, -67, 135, 137, - -1, 1490, -67, -18, -66, -46, -50, -67, -67, -67, - -67, -67, 1490, 76, -67, 67, -67, 68, -67, -10, - -67, -67, 34, 35, 11, -6, -67, -13, -67, -67, - -67, 1490, 75, -67, 1490, 79, -67, 1490, 1490, 1490, - 1490, 1490, 7, 27, 28, 65, 71, 78, 84, 118, - 122, 123, 138, 140, 143, 145, 146, 147, 1490, 1564, - 1490, -67, -16, 5, 12, 159, 161, 1490, 1490, 1459, - 162, 164, 1490, 165, 187, -67, -67, -67, 151, 167, - 153, -67, 275, -67, 312, -67, -67, -67, -67, 1490, - 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, - 1490, 1490, 1490, 1490, 1490, 603, 1490, 1490, 1490, 1490, - 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, - 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, - 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, - 1490, 1490, 139, -67, 170, 16, 172, -67, 173, 1490, - -67, -67, 157, 1621, 1880, -4, 1490, 166, 169, 1658, - 160, -67, 174, 171, 237, 240, 242, 640, 422, 710, - 494, 531, 747, 817, 854, 924, 961, 1031, 1068, 1138, - 1175, 385, 141, -67, 348, 457, 457, 566, 672, 778, - 881, 881, 881, 881, 988, 988, 988, 988, 988, 988, - 988, 988, 988, 988, 988, 988, -15, -15, -15, 8, - 8, 8, 8, -67, -67, -67, -67, -67, -67, -67, - 243, -67, 178, 191, 3, 1695, 1490, -67, 269, 1490, - 1732, -67, -67, -67, 212, 254, -67, -67, -67, -67, - -67, 1490, -67, 1490, 1490, -67, -67, -67, -67, -67, - -67, -67, -67, -67, -67, 1490, -67, -67, -67, 364, - -67, 1490, -67, 1769, -67, 1880, -67, 458, -67, 1245, - 1282, 1352, 1389, 491, 1806, -67, 497, -67, -67, -67, - -67, -67, -67, 1490, 1843, -67 + -68, 9, 1480, -68, 459, -40, -46, -68, 564, 672, + -1, 1430, -68, -23, -45, -48, -41, -68, -68, -68, + -68, -68, -68, 1430, -67, -68, -22, -68, -12, -68, + -28, -68, -68, 29, 30, -13, -5, -68, -7, -68, + -68, -68, -68, 1430, 58, -68, 1430, 59, -68, 1430, + 1430, 1430, 1430, 1430, -3, 5, 8, 11, 12, 28, + 66, 67, 68, 70, 71, 72, 74, 75, 117, 151, + 1430, 1551, 1430, -68, -24, 4, -6, 10, 16, 1430, + 1430, 1398, 19, 41, 1430, 164, 785, -68, -68, -68, + -4, 172, 150, -68, 187, -68, 277, -68, -68, -68, + -68, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, + 1430, 1430, 1430, 1430, 1430, 1430, 1430, 534, 1430, 1430, + 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, + 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, + 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, + 1430, 1430, 1430, 1430, 888, -68, 175, -2, 176, -68, + 178, 1430, -68, -68, 170, 1608, 1867, -20, 1430, 171, + 173, 1645, 168, -68, 174, 169, 69, 245, 246, 571, + 351, 642, 424, 461, 679, 750, 787, 858, 895, 966, + 1003, 1074, 1111, 314, -9, -68, 1903, 387, 387, 1037, + 1144, 1251, 1355, 1355, 1355, 1355, 1929, 1929, 1929, 1929, + 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, -14, -14, + -14, 199, 199, 199, 199, -68, -68, -68, -68, -68, + -68, -68, 247, -68, 177, 179, 7, 1682, 1430, -68, + 250, 1430, 1719, -68, -68, -68, 193, 195, -68, -68, + -68, -68, -68, 1430, -68, 1430, 1430, -68, -68, -68, + -68, -68, -68, -68, -68, -68, -68, 1430, -68, -68, + -68, 196, -68, 1430, -68, 1756, -68, 1867, -68, 182, + -68, 1182, 1219, 1290, 1327, 183, 1793, -68, 189, -68, + -68, -68, -68, -68, -68, 1430, 1830, -68 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -640,50 +643,50 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 3, 0, 0, 1, 0, 0, 92, 104, 0, 0, - 0, 0, 2, 0, 103, 102, 0, 112, 113, 114, - 115, 4, 0, 0, 101, 0, 25, 100, 102, 0, - 106, 100, 0, 0, 0, 0, 96, 95, 99, 93, - 94, 0, 0, 98, 0, 0, 23, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 92, 105, 0, 0, + 0, 0, 2, 0, 104, 103, 0, 113, 114, 115, + 116, 117, 4, 0, 0, 102, 0, 25, 101, 103, + 0, 107, 101, 0, 0, 0, 0, 97, 96, 100, + 93, 94, 95, 0, 0, 99, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 100, 0, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 111, 110, 91, 0, 0, - 0, 18, 0, 21, 0, 41, 68, 54, 42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 101, 0, 0, 0, 0, 0, + 118, 0, 0, 0, 0, 0, 0, 112, 111, 91, + 0, 0, 0, 18, 0, 21, 0, 41, 68, 54, + 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 0, 0, 0, 5, 0, 0, - 12, 105, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 107, 90, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, 0, 5, + 0, 0, 12, 106, 0, 0, 119, 0, 0, 0, + 0, 0, 0, 108, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 57, 56, 55, 45, 43, 44, - 31, 32, 58, 59, 33, 36, 34, 35, 37, 38, - 39, 40, 60, 61, 62, 63, 46, 47, 48, 29, - 30, 64, 65, 49, 50, 52, 51, 53, 66, 67, - 0, 86, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 16, 17, 7, 0, 0, 97, 20, 22, 24, - 72, 0, 71, 0, 0, 78, 69, 70, 80, 81, - 82, 77, 76, 79, 83, 0, 88, 19, 85, 0, - 6, 0, 8, 0, 14, 118, 13, 0, 89, 0, - 0, 0, 0, 0, 0, 11, 0, 73, 74, 75, - 84, 87, 10, 0, 0, 15 + 0, 0, 0, 0, 0, 28, 57, 56, 55, 45, + 43, 44, 31, 32, 58, 59, 33, 36, 34, 35, + 37, 38, 39, 40, 60, 61, 62, 63, 46, 47, + 48, 29, 30, 64, 65, 49, 50, 52, 51, 53, + 66, 67, 0, 86, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 16, 17, 7, 0, 0, 98, 20, + 22, 24, 72, 0, 71, 0, 0, 78, 69, 70, + 80, 81, 82, 77, 76, 79, 83, 0, 88, 19, + 85, 0, 6, 0, 8, 0, 14, 120, 13, 0, + 89, 0, 0, 0, 0, 0, 0, 11, 0, 73, + 74, 75, 84, 87, 10, 0, 0, 15 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -67, -67, -67, -67, -11, 645, -8, 1, 557, -67, - 752, 0, 704 + -68, -68, -68, -68, -11, 264, -8, 1, 110, -68, + 267, 0, 154 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 2, 21, 164, 70, 42, 71, 24, 25, - 43, 72, 165 + -1, 1, 2, 22, 166, 72, 44, 73, 25, 26, + 45, 74, 167 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -691,369 +694,369 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 69, 45, 27, 23, 31, 30, 46, 4, 75, 3, - 270, 79, 157, 74, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 4, 78, 32, 76, 77, - 90, 34, -109, 92, 33, 35, 94, 95, 96, 97, - 98, 145, 146, 147, 148, 149, 150, 151, 73, 85, - 86, 17, 18, 19, 20, 84, 7, 115, 154, 153, - 155, 88, 156, 14, 28, 89, 163, 17, 18, 19, - 20, 169, 29, 238, 7, 239, 87, 47, 271, 158, - 159, 14, 91, 99, 31, 171, 93, 160, 177, 178, + 71, 47, 28, 24, 32, 31, 48, 4, 82, 3, + 83, 159, 81, 76, 272, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 33, 78, 79, 35, + 77, -110, 92, 36, 34, 94, 80, 86, 96, 97, + 98, 99, 100, 75, 87, 88, 17, 18, 19, 20, + 21, 156, 89, 157, 84, 158, 7, 85, 240, 117, + 241, 155, 90, 14, -109, 93, 95, -109, 165, 268, + 162, 241, 91, 171, 101, 163, 249, 174, 49, 160, + 161, 164, 102, 273, 169, 103, 32, 173, 104, 105, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 100, 101, 194, 195, 196, 197, 198, + 189, 190, 191, 192, 193, 106, 170, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 102, 82, -108, 230, 83, -108, 103, 235, 5, - 80, 5, 81, 5, 104, 240, 116, 117, 118, 119, - 105, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 36, 106, 36, 4, 36, 107, 108, - 37, 38, 37, 38, 37, 38, 39, 40, 39, 40, - 39, 40, 4, 41, 109, 44, 110, 5, 266, 111, - 239, 112, 113, 114, 161, 273, 162, 167, 275, 168, - 170, 172, 236, 174, 173, 231, 6, 233, 234, 244, - 279, 241, 280, 281, 247, 7, 242, 248, 245, 249, - 267, 246, 14, 28, 282, 268, 17, 18, 19, 20, - 284, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 269, 16, 17, 18, 19, 20, 274, 277, 116, 117, - 118, 119, 294, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 116, 117, 118, 119, 278, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 117, 118, 119, 175, 120, 121, 122, 123, + 229, 230, 231, 107, 108, 109, 232, 110, 111, 112, + 237, 113, 114, 118, 119, 120, 121, 242, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 116, 117, - 118, 119, 176, 120, 121, 122, 123, 124, 125, 126, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 118, 119, 120, 121, 115, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 116, 117, 118, 119, 283, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 147, 148, 149, 150, 151, 152, 153, 275, 116, 172, + 277, 176, 147, 148, 149, 150, 151, 152, 153, 175, + 233, 235, 281, 236, 282, 283, 238, 243, 246, 247, + 248, 244, 250, 251, 269, 270, 284, 276, 279, 271, + 280, 285, 286, 288, 293, 295, 23, 234, 177, 27, + 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 119, 120, 121, 296, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 118, 119, 120, + 121, 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 264, 119, 265, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 116, 117, 118, - 119, 251, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 116, 117, 118, 119, 286, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 291, 293, 253, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 116, 117, 118, 119, - 254, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 116, 117, 118, 119, 22, 120, 121, + 150, 151, 152, 153, 118, 119, 120, 121, 178, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 266, 121, 267, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 118, 119, 120, + 121, 253, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 118, 119, 120, 121, 4, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 0, 0, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 14, 29, 0, 0, 17, 18, + 19, 20, 21, 0, 30, 0, 0, 118, 119, 120, + 121, 256, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 118, 119, 120, 121, 5, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 37, 0, 0, 0, 0, 0, 0, 38, + 39, 0, 0, 0, 0, 40, 41, 42, 0, 0, + 0, 0, 0, 43, 0, 118, 119, 120, 121, 252, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 193, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 152, 153, 118, 119, 120, 121, 5, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 0, + 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 38, 39, 0, + 0, 0, 0, 40, 41, 42, 0, 0, 0, 0, + 0, 46, 0, 118, 119, 120, 121, 257, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 118, 119, 120, 121, 4, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 0, 258, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, + 14, 29, 0, 0, 17, 18, 19, 20, 21, 0, + 0, 118, 119, 120, 121, 259, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 118, 119, + 120, 121, 5, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 0, 260, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 38, 39, 0, 0, 0, 0, 40, + 41, 42, 0, 0, 0, 0, 0, 0, 0, 118, + 119, 120, 121, 261, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 118, 119, 120, 121, + 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 0, 262, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 118, 119, 120, + 121, 263, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 232, 116, 117, 118, 119, 250, 120, 121, + 150, 151, 152, 153, 118, 119, 120, 121, 0, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 264, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 0, 118, 119, 120, 121, 265, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 116, 117, 118, 119, 26, 120, 121, 122, 123, 124, + 152, 153, 118, 119, 120, 121, 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 252, 122, 123, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 0, + 289, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 0, 118, 119, 120, 121, 290, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 192, 0, - 116, 117, 118, 119, 255, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 116, 117, 118, - 119, 0, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 256, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 0, 0, 0, 0, 0, 0, 116, 117, 118, - 119, 257, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 116, 117, 118, 119, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 258, -110, -110, -110, -110, -110, -110, -110, -110, - -110, -110, -110, -110, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 0, 0, - 0, 0, 0, 0, 116, 117, 118, 119, 259, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 116, 117, 118, 119, 0, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 260, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 116, 117, 118, 119, 261, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 116, 117, - 118, 119, 0, 120, 121, 122, 123, 124, 125, 126, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 118, 119, 120, 121, 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, - 118, 119, 263, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 116, 117, 118, 119, 0, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 287, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 116, 117, 118, 119, 288, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 116, 117, 118, 119, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 289, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 116, 117, 118, 119, 290, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 0, 49, 6, 0, 0, 0, 0, 0, 0, - 50, 51, 52, 53, 166, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 7, 0, - 0, 0, 0, 0, 0, 14, 28, 0, 67, 17, - 18, 19, 20, 0, 0, 0, 68, 116, 117, 118, - 119, 0, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 152, 116, 117, 118, 119, 237, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 116, 117, 118, 119, 243, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 116, 117, - 118, 119, 272, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 116, 117, 118, 119, 276, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 116, 117, 118, 119, 285, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 116, - 117, 118, 119, 292, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 116, 117, 118, 119, - 295, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 147, 148, 149, 150, 151, 152, 153, 0, 291, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 116, 117, 118, 119, 0, 120, 121, + 149, 150, 151, 152, 153, 0, 0, 0, 0, 0, + 0, 118, 119, 120, 121, 292, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 0, 51, 6, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 55, 168, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 7, 4, + 0, 0, 0, 0, 5, 14, 29, 0, 69, 17, + 18, 19, 20, 21, 0, 0, 0, 70, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 0, 16, 17, + 18, 19, 20, 21, 118, 119, 120, 121, 0, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 118, 119, 120, 121, 239, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 118, 119, + 120, 121, 245, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 118, 119, 120, 121, 274, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151 + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 118, 119, 120, 121, 278, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 118, + 119, 120, 121, 287, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 118, 119, 120, 121, + 294, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 118, 119, 120, 121, 297, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 118, 119, 120, 121, 0, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 119, 120, 121, + 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, -111, -111, -111, -111, -111, -111, -111, + -111, -111, -111, -111, -111, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153 }; static const yytype_int16 yycheck[] = { - 11, 9, 2, 2, 4, 4, 7, 9, 74, 0, - 7, 22, 7, 13, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 9, 76, 66, 74, 75, - 41, 74, 78, 44, 73, 78, 47, 48, 49, 50, - 51, 33, 34, 35, 36, 37, 38, 39, 66, 15, - 15, 69, 70, 71, 72, 65, 58, 68, 74, 70, - 76, 67, 78, 65, 66, 78, 77, 69, 70, 71, - 72, 82, 74, 77, 58, 79, 65, 78, 75, 74, - 75, 65, 7, 76, 84, 84, 7, 75, 99, 100, + 11, 9, 2, 2, 4, 4, 7, 9, 75, 0, + 77, 7, 23, 13, 7, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 66, 75, 76, 75, + 75, 79, 43, 79, 74, 46, 77, 65, 49, 50, + 51, 52, 53, 66, 15, 15, 69, 70, 71, 72, + 73, 75, 65, 77, 76, 79, 58, 79, 78, 70, + 80, 72, 67, 65, 76, 7, 7, 79, 79, 78, + 76, 80, 79, 84, 77, 65, 7, 81, 79, 75, + 76, 65, 77, 76, 65, 77, 86, 86, 77, 77, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 76, 76, 116, 117, 118, 119, 120, + 111, 112, 113, 114, 115, 77, 65, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 76, 75, 75, 152, 78, 78, 76, 159, 14, - 74, 14, 76, 14, 76, 166, 3, 4, 5, 6, - 76, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 58, 76, 58, 9, 58, 76, 76, - 65, 66, 65, 66, 65, 66, 71, 72, 71, 72, - 71, 72, 9, 78, 76, 78, 76, 14, 77, 76, - 79, 76, 76, 76, 65, 236, 65, 65, 239, 65, - 65, 80, 75, 80, 67, 65, 33, 65, 65, 79, - 251, 75, 253, 254, 7, 58, 77, 7, 74, 7, - 7, 80, 65, 66, 265, 77, 69, 70, 71, 72, - 271, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 79, 68, 69, 70, 71, 72, 7, 65, 3, 4, - 5, 6, 293, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 3, 4, 5, 6, 65, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 4, 5, 6, 80, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, - 5, 6, 80, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 3, 4, 5, 6, 65, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 77, 6, 79, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, - 6, 79, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 3, 4, 5, 6, 80, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 80, 75, 79, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, - 79, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 3, 4, 5, 6, 2, 8, 9, + 151, 152, 153, 77, 77, 77, 154, 77, 77, 77, + 161, 77, 77, 3, 4, 5, 6, 168, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 77, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 155, 3, 4, 5, 6, 77, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 3, 4, 5, 6, 2, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 77, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 114, -1, 3, 4, 5, 6, 77, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 238, 77, 65, + 241, 81, 33, 34, 35, 36, 37, 38, 39, 67, + 65, 65, 253, 65, 255, 256, 76, 76, 80, 75, + 81, 78, 7, 7, 7, 78, 267, 7, 65, 80, + 65, 65, 273, 81, 81, 76, 2, 157, 81, 2, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, 6, 295, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 77, 14, 15, 16, 17, 18, + 36, 37, 38, 39, 3, 4, 5, 6, 81, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, -1, -1, -1, -1, -1, -1, 3, 4, 5, - 6, 77, 8, 9, 10, 11, 12, 13, 14, 15, + 39, -1, 78, 6, 80, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, + 6, 80, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 3, 4, 5, 6, 9, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, -1, -1, -1, 80, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, + -1, -1, -1, -1, 65, 66, -1, -1, 69, 70, + 71, 72, 73, -1, 75, -1, -1, 3, 4, 5, + 6, 80, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 3, 4, 5, 6, 14, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, -1, 78, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 58, -1, -1, -1, -1, -1, -1, 65, + 66, -1, -1, -1, -1, 71, 72, 73, -1, -1, + -1, -1, -1, 79, -1, 3, 4, 5, 6, 78, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 3, 4, 5, 6, 14, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, -1, + 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 58, -1, -1, -1, -1, -1, -1, 65, 66, -1, + -1, -1, -1, 71, 72, 73, -1, -1, -1, -1, + -1, 79, -1, 3, 4, 5, 6, 78, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 3, 4, 5, 6, 9, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, -1, 78, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, + 65, 66, -1, -1, 69, 70, 71, 72, 73, -1, + -1, 3, 4, 5, 6, 78, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, + 5, 6, 14, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, -1, 78, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, + -1, -1, -1, 65, 66, -1, -1, -1, -1, 71, + 72, 73, -1, -1, -1, -1, -1, -1, -1, 3, + 4, 5, 6, 78, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, + -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, -1, 78, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, + 6, 78, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 77, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, -1, -1, - -1, -1, -1, -1, 3, 4, 5, 6, 77, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 3, 4, 5, 6, -1, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 77, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3, 4, 5, 6, 77, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, - 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 77, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3, 4, - 5, 6, 77, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 3, 4, 5, 6, -1, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 77, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, 4, 5, 6, 77, + 39, -1, 78, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, -1, 3, 4, 5, 6, 78, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 77, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3, 4, 5, 6, 77, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 9, + 31, 32, 33, 34, 35, 36, 37, 38, 39, -1, + 78, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, -1, -1, 3, 4, 5, 6, 78, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, -1, 78, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, + -1, 3, 4, 5, 6, 78, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, 32, 33, -1, -1, -1, -1, -1, -1, - 40, 41, 42, 43, 75, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - -1, -1, -1, -1, -1, 65, 66, -1, 68, 69, - 70, 71, 72, -1, -1, -1, 76, 3, 4, 5, - 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, -1, -1, -1, -1, -1, -1, + 40, 41, 42, 43, 76, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 9, + -1, -1, -1, -1, 14, 65, 66, -1, 68, 69, + 70, 71, 72, 73, -1, -1, -1, 77, -1, -1, + -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, 3, 4, 5, 6, 7, 8, + -1, -1, -1, -1, -1, -1, -1, -1, 58, 59, + 60, 61, 62, 63, 64, 65, 66, -1, 68, 69, + 70, 71, 72, 73, 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 59, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3, 4, @@ -1075,63 +1078,74 @@ static const yytype_int16 yycheck[] = 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 3, 4, 5, 6, -1, 8, 9, + 37, 38, 39, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 4, 5, 6, + -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 82, 83, 0, 9, 14, 33, 58, 59, 60, + 0, 83, 84, 0, 9, 14, 33, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, - 72, 84, 86, 88, 89, 90, 91, 92, 66, 74, - 88, 92, 66, 73, 74, 78, 58, 65, 66, 71, - 72, 78, 87, 91, 78, 87, 7, 78, 30, 32, - 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 68, 76, 85, - 86, 88, 92, 66, 92, 74, 74, 75, 76, 85, - 74, 76, 75, 78, 65, 15, 15, 65, 67, 78, - 85, 7, 85, 7, 85, 85, 85, 85, 85, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 85, 3, 4, 5, 6, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 59, 85, 74, 76, 78, 7, 74, 75, - 75, 65, 65, 85, 85, 93, 75, 65, 65, 85, - 65, 88, 80, 67, 80, 80, 80, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 93, 77, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 87, 65, 89, 65, 65, 85, 75, 7, 77, 79, - 85, 75, 77, 7, 79, 74, 80, 7, 7, 7, - 77, 79, 77, 79, 79, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 79, 77, 7, 77, 79, - 7, 75, 7, 85, 7, 85, 7, 65, 65, 85, - 85, 85, 85, 65, 85, 7, 80, 77, 77, 77, - 77, 80, 7, 75, 85, 7 + 72, 73, 85, 87, 89, 90, 91, 92, 93, 66, + 75, 89, 93, 66, 74, 75, 79, 58, 65, 66, + 71, 72, 73, 79, 88, 92, 79, 88, 7, 79, + 30, 32, 40, 41, 42, 43, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 68, + 77, 86, 87, 89, 93, 66, 93, 75, 75, 76, + 77, 86, 75, 77, 76, 79, 65, 15, 15, 65, + 67, 79, 86, 7, 86, 7, 86, 86, 86, 86, + 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 86, 3, 4, + 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 59, 86, 75, 77, 79, 7, + 75, 76, 76, 65, 65, 86, 86, 94, 76, 65, + 65, 86, 65, 89, 81, 67, 81, 81, 81, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 94, 78, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 88, 65, 90, 65, 65, 86, 76, 7, + 78, 80, 86, 76, 78, 7, 80, 75, 81, 7, + 7, 7, 78, 80, 78, 80, 80, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 80, 78, 7, + 78, 80, 7, 76, 7, 86, 7, 86, 7, 65, + 65, 86, 86, 86, 86, 65, 86, 7, 81, 78, + 78, 78, 78, 81, 7, 76, 86, 7 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 81, 82, 83, 83, 83, 83, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, + 0, 82, 83, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, - 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, - 88, 88, 88, 89, 89, 89, 89, 89, 90, 90, - 91, 91, 92, 92, 92, 92, 93, 93, 93 + 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, + 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, + 88, 89, 89, 89, 90, 90, 90, 90, 90, 91, + 91, 92, 92, 93, 93, 93, 93, 93, 94, 94, + 94 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -1146,9 +1160,10 @@ static const yytype_uint8 yyr2[] = 3, 3, 3, 3, 3, 3, 3, 3, 2, 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 3, 6, 4, 6, - 4, 3, 1, 1, 1, 1, 1, 4, 1, 1, - 1, 1, 1, 1, 1, 3, 2, 4, 1, 1, - 3, 3, 1, 1, 1, 1, 0, 1, 3 + 4, 3, 1, 1, 1, 1, 1, 1, 4, 1, + 1, 1, 1, 1, 1, 1, 3, 2, 4, 1, + 1, 3, 3, 1, 1, 1, 1, 1, 0, 1, + 3 }; @@ -1572,69 +1587,69 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) switch (yytype) { case 65: /* INTEGER */ -#line 90 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ +#line 92 "pcodeparse.y" /* yacc.c:1257 */ { delete ((*yyvaluep).i); } -#line 1563 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1578 "pcodeparse.cc" /* yacc.c:1257 */ break; case 66: /* STRING */ -#line 91 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ +#line 93 "pcodeparse.y" /* yacc.c:1257 */ { delete ((*yyvaluep).str); } -#line 1569 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1584 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 83: /* rtlmid */ -#line 93 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 84: /* rtlmid */ +#line 95 "pcodeparse.y" /* yacc.c:1257 */ { delete ((*yyvaluep).sem); } -#line 1575 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1590 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 84: /* statement */ -#line 94 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 85: /* statement */ +#line 96 "pcodeparse.y" /* yacc.c:1257 */ { if (((*yyvaluep).stmt) != (vector *)0) { for(int4 i=0;i<((*yyvaluep).stmt)->size();++i) delete (*((*yyvaluep).stmt))[i]; delete ((*yyvaluep).stmt);} } -#line 1581 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1596 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 85: /* expr */ -#line 95 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 86: /* expr */ +#line 97 "pcodeparse.y" /* yacc.c:1257 */ { delete ((*yyvaluep).tree); } -#line 1587 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1602 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 86: /* sizedstar */ -#line 97 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 87: /* sizedstar */ +#line 99 "pcodeparse.y" /* yacc.c:1257 */ { delete ((*yyvaluep).starqual); } -#line 1593 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1608 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 87: /* jumpdest */ -#line 96 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 88: /* jumpdest */ +#line 98 "pcodeparse.y" /* yacc.c:1257 */ { if (((*yyvaluep).varnode) != (VarnodeTpl *)0) delete ((*yyvaluep).varnode); } -#line 1599 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1614 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 88: /* varnode */ -#line 96 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 89: /* varnode */ +#line 98 "pcodeparse.y" /* yacc.c:1257 */ { if (((*yyvaluep).varnode) != (VarnodeTpl *)0) delete ((*yyvaluep).varnode); } -#line 1605 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1620 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 89: /* integervarnode */ -#line 96 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 90: /* integervarnode */ +#line 98 "pcodeparse.y" /* yacc.c:1257 */ { if (((*yyvaluep).varnode) != (VarnodeTpl *)0) delete ((*yyvaluep).varnode); } -#line 1611 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1626 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 90: /* lhsvarnode */ -#line 96 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 91: /* lhsvarnode */ +#line 98 "pcodeparse.y" /* yacc.c:1257 */ { if (((*yyvaluep).varnode) != (VarnodeTpl *)0) delete ((*yyvaluep).varnode); } -#line 1617 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1632 "pcodeparse.cc" /* yacc.c:1257 */ break; - case 93: /* paramlist */ -#line 92 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1257 */ + case 94: /* paramlist */ +#line 94 "pcodeparse.y" /* yacc.c:1257 */ { for(int4 i=0;i<((*yyvaluep).param)->size();++i) delete (*((*yyvaluep).param))[i]; delete ((*yyvaluep).param); } -#line 1623 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1257 */ +#line 1638 "pcodeparse.cc" /* yacc.c:1257 */ break; @@ -1896,709 +1911,721 @@ yyreduce: switch (yyn) { case 2: -#line 100 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 102 "pcodeparse.y" /* yacc.c:1646 */ { pcode->setResult((yyvsp[-1].sem)); } -#line 1887 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1902 "pcodeparse.cc" /* yacc.c:1646 */ break; case 3: -#line 102 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 104 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.sem) = new ConstructTpl(); } -#line 1893 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1908 "pcodeparse.cc" /* yacc.c:1646 */ break; case 4: -#line 103 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 105 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-1].sem); if (!(yyval.sem)->addOpList(*(yyvsp[0].stmt))) { delete (yyvsp[0].stmt); yyerror("Multiple delayslot declarations"); YYERROR; } delete (yyvsp[0].stmt); } -#line 1899 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1914 "pcodeparse.cc" /* yacc.c:1646 */ break; case 5: -#line 104 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 106 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-3].sem); pcode->newLocalDefinition((yyvsp[-1].str)); } -#line 1905 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1920 "pcodeparse.cc" /* yacc.c:1646 */ break; case 6: -#line 105 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 107 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-5].sem); pcode->newLocalDefinition((yyvsp[-3].str),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 1911 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1926 "pcodeparse.cc" /* yacc.c:1646 */ break; case 7: -#line 107 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 109 "pcodeparse.y" /* yacc.c:1646 */ { (yyvsp[-1].tree)->setOutput((yyvsp[-3].varnode)); (yyval.stmt) = ExprTree::toVector((yyvsp[-1].tree)); } -#line 1917 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1932 "pcodeparse.cc" /* yacc.c:1646 */ break; case 8: -#line 108 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 110 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->newOutput(true,(yyvsp[-1].tree),(yyvsp[-3].str)); } -#line 1923 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1938 "pcodeparse.cc" /* yacc.c:1646 */ break; case 9: -#line 109 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 111 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->newOutput(false,(yyvsp[-1].tree),(yyvsp[-3].str)); } -#line 1929 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1944 "pcodeparse.cc" /* yacc.c:1646 */ break; case 10: -#line 110 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 112 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->newOutput(true,(yyvsp[-1].tree),(yyvsp[-5].str),*(yyvsp[-3].i)); delete (yyvsp[-3].i); } -#line 1935 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1950 "pcodeparse.cc" /* yacc.c:1646 */ break; case 11: -#line 111 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 113 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->newOutput(true,(yyvsp[-1].tree),(yyvsp[-5].str),*(yyvsp[-3].i)); delete (yyvsp[-3].i); } -#line 1941 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1956 "pcodeparse.cc" /* yacc.c:1646 */ break; case 12: -#line 112 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 114 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = (vector *)0; string errmsg = "Redefinition of symbol: "+(yyvsp[-1].specsym)->getName(); yyerror(errmsg.c_str()); YYERROR; } -#line 1947 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1962 "pcodeparse.cc" /* yacc.c:1646 */ break; case 13: -#line 113 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 115 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createStore((yyvsp[-4].starqual),(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 1953 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1968 "pcodeparse.cc" /* yacc.c:1646 */ break; case 14: -#line 114 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 116 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createUserOpNoOut((yyvsp[-4].useropsym),(yyvsp[-2].param)); } -#line 1959 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1974 "pcodeparse.cc" /* yacc.c:1646 */ break; case 15: -#line 115 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 117 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->assignBitRange((yyvsp[-8].varnode),(uint4)*(yyvsp[-6].i),(uint4)*(yyvsp[-4].i),(yyvsp[-1].tree)); delete (yyvsp[-6].i), delete (yyvsp[-4].i); } -#line 1965 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1980 "pcodeparse.cc" /* yacc.c:1646 */ break; case 16: -#line 116 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 118 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = (vector *)0; delete (yyvsp[-3].varnode); delete (yyvsp[-1].i); yyerror("Illegal truncation on left-hand side of assignment"); YYERROR; } -#line 1971 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1986 "pcodeparse.cc" /* yacc.c:1646 */ break; case 17: -#line 117 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 119 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = (vector *)0; delete (yyvsp[-3].varnode); delete (yyvsp[-1].i); yyerror("Illegal subpiece on left-hand side of assignment"); YYERROR; } -#line 1977 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1992 "pcodeparse.cc" /* yacc.c:1646 */ break; case 18: -#line 118 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 120 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_BRANCH,new ExprTree((yyvsp[-1].varnode))); } -#line 1983 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 1998 "pcodeparse.cc" /* yacc.c:1646 */ break; case 19: -#line 119 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 121 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_CBRANCH,new ExprTree((yyvsp[-1].varnode)),(yyvsp[-3].tree)); } -#line 1989 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2004 "pcodeparse.cc" /* yacc.c:1646 */ break; case 20: -#line 120 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 122 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_BRANCHIND,(yyvsp[-2].tree)); } -#line 1995 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2010 "pcodeparse.cc" /* yacc.c:1646 */ break; case 21: -#line 121 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 123 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_CALL,new ExprTree((yyvsp[-1].varnode))); } -#line 2001 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2016 "pcodeparse.cc" /* yacc.c:1646 */ break; case 22: -#line 122 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 124 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_CALLIND,(yyvsp[-2].tree)); } -#line 2007 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2022 "pcodeparse.cc" /* yacc.c:1646 */ break; case 23: -#line 123 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 125 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = (vector *)0; yyerror("Must specify an indirect parameter for return"); YYERROR; } -#line 2013 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2028 "pcodeparse.cc" /* yacc.c:1646 */ break; case 24: -#line 124 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 126 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->createOpNoOut(CPUI_RETURN,(yyvsp[-2].tree)); } -#line 2019 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2034 "pcodeparse.cc" /* yacc.c:1646 */ break; case 25: -#line 125 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 127 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.stmt) = pcode->placeLabel( (yyvsp[0].labelsym) ); } -#line 2025 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2040 "pcodeparse.cc" /* yacc.c:1646 */ break; case 26: -#line 127 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 129 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = new ExprTree((yyvsp[0].varnode)); } -#line 2031 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2046 "pcodeparse.cc" /* yacc.c:1646 */ break; case 27: -#line 128 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 130 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createLoad((yyvsp[-1].starqual),(yyvsp[0].tree)); } -#line 2037 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2052 "pcodeparse.cc" /* yacc.c:1646 */ break; case 28: -#line 129 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 131 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = (yyvsp[-1].tree); } -#line 2043 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2058 "pcodeparse.cc" /* yacc.c:1646 */ break; case 29: -#line 130 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 132 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_ADD,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2049 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2064 "pcodeparse.cc" /* yacc.c:1646 */ break; case 30: -#line 131 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 133 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SUB,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2055 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2070 "pcodeparse.cc" /* yacc.c:1646 */ break; case 31: -#line 132 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 134 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_EQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2061 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2076 "pcodeparse.cc" /* yacc.c:1646 */ break; case 32: -#line 133 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 135 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_NOTEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2067 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2082 "pcodeparse.cc" /* yacc.c:1646 */ break; case 33: -#line 134 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 136 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_LESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2073 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2088 "pcodeparse.cc" /* yacc.c:1646 */ break; case 34: -#line 135 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 137 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_LESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2079 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2094 "pcodeparse.cc" /* yacc.c:1646 */ break; case 35: -#line 136 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 138 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_LESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2085 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2100 "pcodeparse.cc" /* yacc.c:1646 */ break; case 36: -#line 137 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 139 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_LESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2091 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2106 "pcodeparse.cc" /* yacc.c:1646 */ break; case 37: -#line 138 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 140 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SLESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2097 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2112 "pcodeparse.cc" /* yacc.c:1646 */ break; case 38: -#line 139 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 141 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SLESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2103 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2118 "pcodeparse.cc" /* yacc.c:1646 */ break; case 39: -#line 140 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 142 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SLESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2109 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2124 "pcodeparse.cc" /* yacc.c:1646 */ break; case 40: -#line 141 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 143 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SLESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2115 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2130 "pcodeparse.cc" /* yacc.c:1646 */ break; case 41: -#line 142 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 144 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_2COMP,(yyvsp[0].tree)); } -#line 2121 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2136 "pcodeparse.cc" /* yacc.c:1646 */ break; case 42: -#line 143 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 145 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_NEGATE,(yyvsp[0].tree)); } -#line 2127 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2142 "pcodeparse.cc" /* yacc.c:1646 */ break; case 43: -#line 144 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 146 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_XOR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2133 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2148 "pcodeparse.cc" /* yacc.c:1646 */ break; case 44: -#line 145 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 147 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_AND,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2139 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2154 "pcodeparse.cc" /* yacc.c:1646 */ break; case 45: -#line 146 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 148 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_OR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2145 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2160 "pcodeparse.cc" /* yacc.c:1646 */ break; case 46: -#line 147 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 149 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_LEFT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2151 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2166 "pcodeparse.cc" /* yacc.c:1646 */ break; case 47: -#line 148 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 150 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_RIGHT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2157 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2172 "pcodeparse.cc" /* yacc.c:1646 */ break; case 48: -#line 149 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 151 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SRIGHT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2163 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2178 "pcodeparse.cc" /* yacc.c:1646 */ break; case 49: -#line 150 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 152 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_MULT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2169 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2184 "pcodeparse.cc" /* yacc.c:1646 */ break; case 50: -#line 151 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 153 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_DIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2175 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2190 "pcodeparse.cc" /* yacc.c:1646 */ break; case 51: -#line 152 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 154 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SDIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2181 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2196 "pcodeparse.cc" /* yacc.c:1646 */ break; case 52: -#line 153 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 155 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_REM,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2187 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2202 "pcodeparse.cc" /* yacc.c:1646 */ break; case 53: -#line 154 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 156 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SREM,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2193 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2208 "pcodeparse.cc" /* yacc.c:1646 */ break; case 54: -#line 155 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 157 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_BOOL_NEGATE,(yyvsp[0].tree)); } -#line 2199 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2214 "pcodeparse.cc" /* yacc.c:1646 */ break; case 55: -#line 156 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 158 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_BOOL_XOR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2205 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2220 "pcodeparse.cc" /* yacc.c:1646 */ break; case 56: -#line 157 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 159 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_BOOL_AND,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2211 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2226 "pcodeparse.cc" /* yacc.c:1646 */ break; case 57: -#line 158 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 160 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_BOOL_OR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2217 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2232 "pcodeparse.cc" /* yacc.c:1646 */ break; case 58: -#line 159 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 161 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_EQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2223 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2238 "pcodeparse.cc" /* yacc.c:1646 */ break; case 59: -#line 160 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 162 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_NOTEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2229 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2244 "pcodeparse.cc" /* yacc.c:1646 */ break; case 60: -#line 161 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 163 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_LESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2235 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2250 "pcodeparse.cc" /* yacc.c:1646 */ break; case 61: -#line 162 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 164 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_LESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2241 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2256 "pcodeparse.cc" /* yacc.c:1646 */ break; case 62: -#line 163 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 165 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_LESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2247 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2262 "pcodeparse.cc" /* yacc.c:1646 */ break; case 63: -#line 164 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 166 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_LESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 2253 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2268 "pcodeparse.cc" /* yacc.c:1646 */ break; case 64: -#line 165 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 167 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_ADD,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2259 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2274 "pcodeparse.cc" /* yacc.c:1646 */ break; case 65: -#line 166 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 168 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_SUB,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2265 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2280 "pcodeparse.cc" /* yacc.c:1646 */ break; case 66: -#line 167 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 169 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_MULT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2271 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2286 "pcodeparse.cc" /* yacc.c:1646 */ break; case 67: -#line 168 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 170 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_DIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 2277 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2292 "pcodeparse.cc" /* yacc.c:1646 */ break; case 68: -#line 169 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 171 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_NEG,(yyvsp[0].tree)); } -#line 2283 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2298 "pcodeparse.cc" /* yacc.c:1646 */ break; case 69: -#line 170 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 172 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_ABS,(yyvsp[-1].tree)); } -#line 2289 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2304 "pcodeparse.cc" /* yacc.c:1646 */ break; case 70: -#line 171 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 173 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_SQRT,(yyvsp[-1].tree)); } -#line 2295 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2310 "pcodeparse.cc" /* yacc.c:1646 */ break; case 71: -#line 172 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 174 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SEXT,(yyvsp[-1].tree)); } -#line 2301 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2316 "pcodeparse.cc" /* yacc.c:1646 */ break; case 72: -#line 173 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 175 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_ZEXT,(yyvsp[-1].tree)); } -#line 2307 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2322 "pcodeparse.cc" /* yacc.c:1646 */ break; case 73: -#line 174 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 176 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_CARRY,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 2313 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2328 "pcodeparse.cc" /* yacc.c:1646 */ break; case 74: -#line 175 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 177 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SCARRY,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 2319 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2334 "pcodeparse.cc" /* yacc.c:1646 */ break; case 75: -#line 176 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 178 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_INT_SBORROW,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 2325 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2340 "pcodeparse.cc" /* yacc.c:1646 */ break; case 76: -#line 177 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 179 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_FLOAT2FLOAT,(yyvsp[-1].tree)); } -#line 2331 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2346 "pcodeparse.cc" /* yacc.c:1646 */ break; case 77: -#line 178 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 180 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_INT2FLOAT,(yyvsp[-1].tree)); } -#line 2337 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2352 "pcodeparse.cc" /* yacc.c:1646 */ break; case 78: -#line 179 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 181 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_NAN,(yyvsp[-1].tree)); } -#line 2343 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2358 "pcodeparse.cc" /* yacc.c:1646 */ break; case 79: -#line 180 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 182 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_TRUNC,(yyvsp[-1].tree)); } -#line 2349 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2364 "pcodeparse.cc" /* yacc.c:1646 */ break; case 80: -#line 181 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 183 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_CEIL,(yyvsp[-1].tree)); } -#line 2355 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2370 "pcodeparse.cc" /* yacc.c:1646 */ break; case 81: -#line 182 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 184 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_FLOOR,(yyvsp[-1].tree)); } -#line 2361 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2376 "pcodeparse.cc" /* yacc.c:1646 */ break; case 82: -#line 183 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 185 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_FLOAT_ROUND,(yyvsp[-1].tree)); } -#line 2367 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2382 "pcodeparse.cc" /* yacc.c:1646 */ break; case 83: -#line 184 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 186 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_NEW,(yyvsp[-1].tree)); } -#line 2373 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2388 "pcodeparse.cc" /* yacc.c:1646 */ break; case 84: -#line 185 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 187 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_NEW,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 2379 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2394 "pcodeparse.cc" /* yacc.c:1646 */ break; case 85: -#line 186 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 188 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createOp(CPUI_SUBPIECE,new ExprTree((yyvsp[-3].specsym)->getVarnode()),new ExprTree((yyvsp[-1].varnode))); } -#line 2385 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2400 "pcodeparse.cc" /* yacc.c:1646 */ break; case 86: -#line 187 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 189 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createBitRange((yyvsp[-2].specsym),0,(uint4)(*(yyvsp[0].i) * 8)); delete (yyvsp[0].i); } -#line 2391 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2406 "pcodeparse.cc" /* yacc.c:1646 */ break; case 87: -#line 188 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 190 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createBitRange((yyvsp[-5].specsym),(uint4)*(yyvsp[-3].i),(uint4)*(yyvsp[-1].i)); delete (yyvsp[-3].i), delete (yyvsp[-1].i); } -#line 2397 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2412 "pcodeparse.cc" /* yacc.c:1646 */ break; case 88: -#line 189 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 191 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.tree) = pcode->createUserOp((yyvsp[-3].useropsym),(yyvsp[-1].param)); } -#line 2403 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2418 "pcodeparse.cc" /* yacc.c:1646 */ break; case 89: -#line 191 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 193 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = *(yyvsp[0].i); delete (yyvsp[0].i); (yyval.starqual)->id=ConstTpl((yyvsp[-3].spacesym)->getSpace()); } -#line 2409 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2424 "pcodeparse.cc" /* yacc.c:1646 */ break; case 90: -#line 192 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 194 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = 0; (yyval.starqual)->id=ConstTpl((yyvsp[-1].spacesym)->getSpace()); } -#line 2415 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2430 "pcodeparse.cc" /* yacc.c:1646 */ break; case 91: -#line 193 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 195 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = *(yyvsp[0].i); delete (yyvsp[0].i); (yyval.starqual)->id=ConstTpl(pcode->getDefaultSpace()); } -#line 2421 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2436 "pcodeparse.cc" /* yacc.c:1646 */ break; case 92: -#line 194 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 196 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = 0; (yyval.starqual)->id=ConstTpl(pcode->getDefaultSpace()); } -#line 2427 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2442 "pcodeparse.cc" /* yacc.c:1646 */ break; case 93: -#line 196 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 198 "pcodeparse.y" /* yacc.c:1646 */ { VarnodeTpl *sym = (yyvsp[0].startsym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } -#line 2433 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2448 "pcodeparse.cc" /* yacc.c:1646 */ break; case 94: -#line 197 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 199 "pcodeparse.y" /* yacc.c:1646 */ { VarnodeTpl *sym = (yyvsp[0].endsym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } -#line 2439 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2454 "pcodeparse.cc" /* yacc.c:1646 */ break; case 95: -#line 198 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::j_curspace_size)); delete (yyvsp[0].i); } -#line 2445 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 200 "pcodeparse.y" /* yacc.c:1646 */ + { VarnodeTpl *sym = (yyvsp[0].next2sym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } +#line 2460 "pcodeparse.cc" /* yacc.c:1646 */ break; case 96: -#line 199 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } -#line 2451 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 201 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::j_curspace_size)); delete (yyvsp[0].i); } +#line 2466 "pcodeparse.cc" /* yacc.c:1646 */ break; case 97: -#line 200 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { AddrSpace *spc = (yyvsp[-1].spacesym)->getSpace(); (yyval.varnode) = new VarnodeTpl(ConstTpl(spc),ConstTpl(ConstTpl::real,*(yyvsp[-3].i)),ConstTpl(ConstTpl::real,spc->getAddrSize())); delete (yyvsp[-3].i); } -#line 2457 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 202 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } +#line 2472 "pcodeparse.cc" /* yacc.c:1646 */ break; case 98: -#line 201 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::j_relative,(yyvsp[0].labelsym)->getIndex()),ConstTpl(ConstTpl::real,sizeof(uintm))); (yyvsp[0].labelsym)->incrementRefCount(); } -#line 2463 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 203 "pcodeparse.y" /* yacc.c:1646 */ + { AddrSpace *spc = (yyvsp[-1].spacesym)->getSpace(); (yyval.varnode) = new VarnodeTpl(ConstTpl(spc),ConstTpl(ConstTpl::real,*(yyvsp[-3].i)),ConstTpl(ConstTpl::real,spc->getAddrSize())); delete (yyvsp[-3].i); } +#line 2478 "pcodeparse.cc" /* yacc.c:1646 */ break; case 99: -#line 202 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown jump destination: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2469 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 204 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::j_relative,(yyvsp[0].labelsym)->getIndex()),ConstTpl(ConstTpl::real,sizeof(uintm))); (yyvsp[0].labelsym)->incrementRefCount(); } +#line 2484 "pcodeparse.cc" /* yacc.c:1646 */ break; case 100: -#line 204 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } -#line 2475 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 205 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown jump destination: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 2490 "pcodeparse.cc" /* yacc.c:1646 */ break; case 101: -#line 205 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].varnode); } -#line 2481 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 207 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } +#line 2496 "pcodeparse.cc" /* yacc.c:1646 */ break; case 102: -#line 206 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown varnode parameter: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2487 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 208 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].varnode); } +#line 2502 "pcodeparse.cc" /* yacc.c:1646 */ break; case 103: -#line 208 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::real,0)); delete (yyvsp[0].i); } -#line 2493 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 209 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown varnode parameter: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 2508 "pcodeparse.cc" /* yacc.c:1646 */ break; case 104: -#line 209 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::real,0)); yyerror("Parsed integer is too big (overflow)"); } -#line 2499 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 211 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::real,0)); delete (yyvsp[0].i); } +#line 2514 "pcodeparse.cc" /* yacc.c:1646 */ break; case 105: -#line 210 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } -#line 2505 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 212 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::real,0)); yyerror("Parsed integer is too big (overflow)"); } +#line 2520 "pcodeparse.cc" /* yacc.c:1646 */ break; case 106: -#line 211 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = pcode->addressOf((yyvsp[0].varnode),0); } -#line 2511 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 213 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(pcode->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } +#line 2526 "pcodeparse.cc" /* yacc.c:1646 */ break; case 107: -#line 212 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = pcode->addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 2517 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 214 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = pcode->addressOf((yyvsp[0].varnode),0); } +#line 2532 "pcodeparse.cc" /* yacc.c:1646 */ break; case 108: -#line 214 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } -#line 2523 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 215 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = pcode->addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } +#line 2538 "pcodeparse.cc" /* yacc.c:1646 */ break; case 109: -#line 215 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown assignment varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2529 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 217 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } +#line 2544 "pcodeparse.cc" /* yacc.c:1646 */ break; case 110: -#line 217 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.labelsym) = (yyvsp[-1].labelsym); } -#line 2535 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 218 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (VarnodeTpl *)0; string errmsg = "Unknown assignment varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 2550 "pcodeparse.cc" /* yacc.c:1646 */ break; case 111: -#line 218 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.labelsym) = pcode->defineLabel( (yyvsp[-1].str) ); } -#line 2541 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 220 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.labelsym) = (yyvsp[-1].labelsym); } +#line 2556 "pcodeparse.cc" /* yacc.c:1646 */ break; case 112: -#line 220 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].varsym); } -#line 2547 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 221 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.labelsym) = pcode->defineLabel( (yyvsp[-1].str) ); } +#line 2562 "pcodeparse.cc" /* yacc.c:1646 */ break; case 113: -#line 221 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].operandsym); } -#line 2553 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 223 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].varsym); } +#line 2568 "pcodeparse.cc" /* yacc.c:1646 */ break; case 114: -#line 222 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].startsym); } -#line 2559 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 224 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].operandsym); } +#line 2574 "pcodeparse.cc" /* yacc.c:1646 */ break; case 115: -#line 223 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].endsym); } -#line 2565 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 225 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].startsym); } +#line 2580 "pcodeparse.cc" /* yacc.c:1646 */ break; case 116: -#line 225 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.param) = new vector; } -#line 2571 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 226 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].endsym); } +#line 2586 "pcodeparse.cc" /* yacc.c:1646 */ break; case 117: -#line 226 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ - { (yyval.param) = new vector; (yyval.param)->push_back((yyvsp[0].tree)); } -#line 2577 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 227 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].next2sym); } +#line 2592 "pcodeparse.cc" /* yacc.c:1646 */ break; case 118: -#line 227 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1646 */ +#line 229 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.param) = new vector; } +#line 2598 "pcodeparse.cc" /* yacc.c:1646 */ + break; + + case 119: +#line 230 "pcodeparse.y" /* yacc.c:1646 */ + { (yyval.param) = new vector; (yyval.param)->push_back((yyvsp[0].tree)); } +#line 2604 "pcodeparse.cc" /* yacc.c:1646 */ + break; + + case 120: +#line 231 "pcodeparse.y" /* yacc.c:1646 */ { (yyval.param) = (yyvsp[-2].param); (yyval.param)->push_back((yyvsp[0].tree)); } -#line 2583 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2610 "pcodeparse.cc" /* yacc.c:1646 */ break; -#line 2587 "src/decompile/cpp/pcodeparse.cc" /* yacc.c:1646 */ +#line 2614 "pcodeparse.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2826,7 +2853,7 @@ yyreturn: #endif return yyresult; } -#line 229 "src/decompile/cpp/pcodeparse.y" /* yacc.c:1906 */ +#line 233 "pcodeparse.y" /* yacc.c:1906 */ #define IDENTREC_SIZE 46 @@ -3350,6 +3377,9 @@ int4 PcodeSnippet::lex(void) case SleighSymbol::end_symbol: yylval.endsym = (EndSymbol *)sym; return ENDSYM; + case SleighSymbol::next2_symbol: + yylval.next2sym = (Next2Symbol *)sym; + return NEXT2SYM; case SleighSymbol::label_symbol: yylval.labelsym = (LabelSymbol *)sym; return LABELSYM; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.y b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.y index 454d7c3877..c858fa148c 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.y +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.y @@ -38,6 +38,7 @@ LabelSymbol *labelsym; StartSymbol *startsym; EndSymbol *endsym; + Next2Symbol *next2sym; OperandSymbol *operandsym; VarnodeSymbol *varsym; SpecificSymbol *specsym; @@ -76,6 +77,7 @@ %token OPERANDSYM %token STARTSYM %token ENDSYM +%token NEXT2SYM %token LABELSYM %type paramlist @@ -195,6 +197,7 @@ sizedstar: '*' '[' SPACESYM ']' ':' INTEGER { $$ = new StarQuality; $$->size = * ; jumpdest: STARTSYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } | ENDSYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } + | NEXT2SYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } | INTEGER { $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*$1),ConstTpl(ConstTpl::j_curspace_size)); delete $1; } | BADINTEGER { $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } | INTEGER '[' SPACESYM ']' { AddrSpace *spc = $3->getSpace(); $$ = new VarnodeTpl(ConstTpl(spc),ConstTpl(ConstTpl::real,*$1),ConstTpl(ConstTpl::real,spc->getAddrSize())); delete $1; } @@ -221,6 +224,7 @@ specificsymbol: VARSYM { $$ = $1; } | OPERANDSYM { $$ = $1; } | STARTSYM { $$ = $1; } | ENDSYM { $$ = $1; } + | NEXT2SYM { $$ = $1; } ; paramlist: /* EMPTY */ { $$ = new vector; } | expr { $$ = new vector; $$->push_back($1); } @@ -749,6 +753,9 @@ int4 PcodeSnippet::lex(void) case SleighSymbol::end_symbol: yylval.endsym = (EndSymbol *)sym; return ENDSYM; + case SleighSymbol::next2_symbol: + yylval.next2sym = (Next2Symbol *)sym; + return NEXT2SYM; case SleighSymbol::label_symbol: yylval.labelsym = (LabelSymbol *)sym; return LABELSYM; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc index f8c1580a8e..ecebc09704 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc @@ -121,6 +121,8 @@ uintb ConstTpl::fix(const ParserWalker &walker) const return walker.getAddr().getOffset(); // Fill in starting address placeholder with real address case j_next: return walker.getNaddr().getOffset(); // Fill in next address placeholder with real address + case j_next2: + return walker.getN2addr().getOffset(); // Fill in next2 address placeholder with real address case j_flowref: return walker.getRefAddr().getOffset(); case j_flowref_size: @@ -349,6 +351,9 @@ void ConstTpl::saveXml(ostream &s) const case j_next: s << "next\"/>"; break; + case j_next2: + s << "next2\"/>"; + break; case j_curspace: s << "curspace\"/>"; break; @@ -404,6 +409,9 @@ void ConstTpl::restoreXml(const Element *el,const AddrSpaceManager *manage) else if (typestring=="next") { type = j_next; } + else if (typestring=="next2") { + type = j_next2; + } else if (typestring=="curspace") { type = j_curspace; } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh index dccf0437d7..3b836244c6 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh @@ -30,9 +30,9 @@ class Translate; // Forward declaration class HandleTpl; // Forward declaration class ConstTpl { public: - enum const_type { real=0, handle=1, j_start=2, j_next=3, j_curspace=4, - j_curspace_size=5, spaceid=6, j_relative=7, - j_flowref=8, j_flowref_size=9, j_flowdest=10, j_flowdest_size=11 }; + enum const_type { real=0, handle=1, j_start=2, j_next=3, j_next2=4, j_curspace=5, + j_curspace_size=6, spaceid=7, j_relative=8, + j_flowref=9, j_flowref_size=10, j_flowdest=11, j_flowdest_size=12 }; enum v_field { v_space=0, v_offset=1, v_size=2, v_offset_plus=3 }; private: const_type type; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.cc index 4c06eb5462..0fd86e645b 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.cc @@ -444,7 +444,7 @@ void DisassemblyCache::initialize(int4 min,int4 hashsize) nextfree = 0; hashtable = new ParserContext *[hashsize]; for(int4 i=0;iinitialize(75,20,constspace); list[i] = pos; } @@ -462,13 +462,15 @@ void DisassemblyCache::free(void) delete [] hashtable; } +/// \param trans is the Translate object instantiating this cache (for inst_next2 callbacks) /// \param ccache is the ContextCache front-end shared across all the parser contexts /// \param cspace is the constant address space used for minting constant Varnodes /// \param cachesize is the number of distinct ParserContext objects in this cache /// \param windowsize is the size of the ParserContext hash-table -DisassemblyCache::DisassemblyCache(ContextCache *ccache,AddrSpace *cspace,int4 cachesize,int4 windowsize) +DisassemblyCache::DisassemblyCache(Translate *trans,ContextCache *ccache,AddrSpace *cspace,int4 cachesize,int4 windowsize) { + translate = trans; contextcache = ccache; constspace = cspace; initialize(cachesize,windowsize); // Set default settings for the cache @@ -559,7 +561,7 @@ void Sleigh::initialize(DocumentStorage &store) parser_cachesize = 8; parser_windowsize = 256; } - discache = new DisassemblyCache(cache,getConstantSpace(),parser_cachesize,parser_windowsize); + discache = new DisassemblyCache(this,cache,getConstantSpace(),parser_cachesize,parser_windowsize); } /// \brief Obtain a parse tree for the instruction at the given address diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.hh index 4a66e77606..74fc5cbf8d 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/sleigh.hh @@ -103,6 +103,7 @@ public: /// accessing the ContextDatabase and resolving context variables from the SLEIGH spec. /// ParserContext objects are stored in a hash-table keyed by the address of the instruction. class DisassemblyCache { + Translate *translate; ///< The Translate object that owns this cache ContextCache *contextcache; ///< Cached values from the ContextDatabase AddrSpace *constspace; ///< The constant address space int4 minimumreuse; ///< Can call getParserContext this many times, before a ParserContext is reused @@ -113,7 +114,7 @@ class DisassemblyCache { void initialize(int4 min,int4 hashsize); ///< Initialize the hash-table of ParserContexts void free(void); ///< Free the hash-table of ParserContexts public: - DisassemblyCache(ContextCache *ccache,AddrSpace *cspace,int4 cachesize,int4 windowsize); ///< Constructor + DisassemblyCache(Translate *trans,ContextCache *ccache,AddrSpace *cspace,int4 cachesize,int4 windowsize); ///< Constructor ~DisassemblyCache(void) { free(); } ///< Destructor ParserContext *getParserContext(const Address &addr); ///< Get the parser for a particular Address }; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc index 4a8b301c34..c26cd468fd 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc @@ -1789,7 +1789,7 @@ SleighCompile::SleighCompile(void) } /// Create the address spaces: \b const, \b unique, and \b other. -/// Define the special symbols: \b inst_start, \b inst_next, \b epsilon. +/// Define the special symbols: \b inst_start, \b inst_next, \b inst_next2, \b epsilon. /// Define the root subtable symbol: \b instruction void SleighCompile::predefinedSymbols(void) @@ -1813,6 +1813,8 @@ void SleighCompile::predefinedSymbols(void) symtab.addSymbol(startsym); EndSymbol *endsym = new EndSymbol("inst_next",getConstantSpace()); symtab.addSymbol(endsym); + Next2Symbol *next2sym = new Next2Symbol("inst_next2",getConstantSpace()); + symtab.addSymbol(next2sym); EpsilonSymbol *epsilon = new EpsilonSymbol("epsilon",getConstantSpace()); symtab.addSymbol(epsilon); pcode.setConstantSpace(getConstantSpace()); @@ -2907,20 +2909,23 @@ ConstructTpl *SleighCompile::setResultStarVarnode(ConstructTpl *ct,StarQuality * /// The new change operation is added to the current list. /// When executed, the change operation will assign a new value to the given context variable /// using the specified expression. The change only applies within the parsing of a single instruction. -/// Because we are in the middle of parsing, the \b inst_next value has not been computed yet -/// So we check to make sure the value expression doesn't use this symbol. +/// Because we are in the middle of parsing, the \b inst_next and \b inst_next2 values have not +/// been computed yet. So we check to make sure the value expression doesn't use this symbol. /// \param vec is the current list of change operations /// \param sym is the given context variable affected by the operation /// \param pe is the specified expression -/// \return \b true if the expression does not use the \b inst_next symbol +/// \return \b true if the expression does not use the \b inst_next or \b inst_next2 symbol bool SleighCompile::contextMod(vector *vec,ContextSymbol *sym,PatternExpression *pe) { vector vallist; pe->listValues(vallist); - for(uint4 i=0;i(vallist[i]) != (const EndInstructionValue *)0) return false; + if (dynamic_cast(vallist[i]) != (const Next2InstructionValue *)0) + return false; + } // Otherwise we generate a "temporary" change to context instruction (ContextOp) ContextField *field = (ContextField *)sym->getPatternValue(); ContextOp *op = new ContextOp(field->getStartBit(),field->getEndBit(),pe); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.cc index 116bbac27d..746d70a815 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.cc @@ -77,7 +77,7 @@ /* Copy the first part of user declarations. */ -#line 16 "src/decompile/cpp/slghparse.y" /* yacc.c:339 */ +#line 16 "slghparse.y" /* yacc.c:339 */ #include "slgh_compile.hh" @@ -90,7 +90,7 @@ extern int yylex(void); extern int yyerror(const char *str ); -#line 79 "src/decompile/cpp/slghparse.cc" /* yacc.c:339 */ +#line 79 "slghparse.cc" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -110,8 +110,8 @@ /* In a future release of Bison, this section will be replaced by #include "slghparse.hh". */ -#ifndef YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED -# define YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED +#ifndef YY_YY_SLGHPARSE_HH_INCLUDED +# define YY_YY_SLGHPARSE_HH_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -233,9 +233,10 @@ extern int yydebug; OPERANDSYM = 363, STARTSYM = 364, ENDSYM = 365, - MACROSYM = 366, - LABELSYM = 367, - SUBTABLESYM = 368 + NEXT2SYM = 366, + MACROSYM = 367, + LABELSYM = 368, + SUBTABLESYM = 369 }; #endif @@ -244,7 +245,7 @@ extern int yydebug; union YYSTYPE { -#line 29 "src/decompile/cpp/slghparse.y" /* yacc.c:355 */ +#line 29 "slghparse.y" /* yacc.c:355 */ char ch; uintb *i; @@ -277,6 +278,7 @@ union YYSTYPE SubtableSymbol *subtablesym; StartSymbol *startsym; EndSymbol *endsym; + Next2Symbol *next2sym; OperandSymbol *operandsym; VarnodeListSymbol *varlistsym; VarnodeSymbol *varsym; @@ -288,7 +290,7 @@ union YYSTYPE FamilySymbol *famsym; SpecificSymbol *specsym; -#line 277 "src/decompile/cpp/slghparse.cc" /* yacc.c:355 */ +#line 279 "slghparse.cc" /* yacc.c:355 */ }; typedef union YYSTYPE YYSTYPE; @@ -301,11 +303,11 @@ extern YYSTYPE yylval; int yyparse (void); -#endif /* !YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED */ +#endif /* !YY_YY_SLGHPARSE_HH_INCLUDED */ /* Copy the second part of user declarations. */ -#line 294 "src/decompile/cpp/slghparse.cc" /* yacc.c:358 */ +#line 296 "slghparse.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -547,21 +549,21 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 5 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2654 +#define YYLAST 2617 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 137 +#define YYNTOKENS 138 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 71 /* YYNRULES -- Number of rules. */ -#define YYNRULES 338 +#define YYNRULES 341 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 713 +#define YYNSTATES 716 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 368 +#define YYMAXUTOK 369 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -573,16 +575,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 136, 43, 2, 2, 2, 38, 11, 2, - 129, 130, 36, 32, 131, 33, 2, 37, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 135, 8, - 17, 128, 18, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 137, 43, 2, 2, 2, 38, 11, 2, + 130, 131, 36, 32, 132, 33, 2, 37, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 136, 8, + 17, 129, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 132, 2, 133, 9, 2, 2, 2, 2, 2, + 2, 133, 2, 134, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 134, 6, 127, 44, 2, 2, 2, + 2, 2, 2, 135, 6, 128, 44, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -606,47 +608,48 @@ static const yytype_uint8 yytranslate[] = 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 156, 156, 157, 158, 159, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 172, 173, 174, 175, - 177, 178, 180, 182, 184, 185, 186, 187, 188, 190, - 192, 193, 196, 197, 198, 199, 200, 202, 203, 204, - 205, 206, 207, 209, 211, 212, 213, 214, 215, 216, - 217, 219, 221, 223, 225, 226, 228, 231, 233, 235, - 237, 239, 242, 244, 245, 246, 248, 250, 251, 252, - 255, 256, 259, 261, 262, 263, 265, 266, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 278, 279, 280, - 281, 283, 285, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 302, 303, 304, 305, - 307, 308, 310, 311, 313, 314, 316, 317, 318, 319, - 320, 321, 322, 325, 326, 327, 328, 330, 331, 333, - 334, 335, 336, 337, 338, 340, 341, 343, 345, 346, - 348, 349, 350, 351, 352, 354, 355, 356, 357, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 452, 453, 454, 455, 457, 458, 459, 460, 461, 462, - 463, 464, 466, 467, 468, 469, 471, 472, 473, 474, - 475, 477, 478, 479, 481, 482, 484, 485, 486, 487, - 488, 489, 491, 492, 493, 494, 495, 497, 498, 499, - 500, 501, 503, 504, 506, 507, 508, 510, 511, 512, - 514, 515, 516, 519, 520, 522, 523, 524, 526, 528, - 529, 530, 531, 533, 534, 535, 537, 538, 539, 540, - 541, 543, 544, 546, 547, 549, 550, 553, 554, 555, - 557, 558, 559, 561, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, 576 + 0, 158, 158, 159, 160, 161, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, + 179, 180, 182, 184, 186, 187, 188, 189, 190, 192, + 194, 195, 198, 199, 200, 201, 202, 204, 205, 206, + 207, 208, 209, 211, 213, 214, 215, 216, 217, 218, + 219, 221, 223, 225, 227, 228, 230, 233, 235, 237, + 239, 241, 244, 246, 247, 248, 250, 252, 253, 254, + 257, 258, 261, 263, 264, 265, 267, 268, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 280, 281, 282, + 283, 285, 287, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 304, 305, 306, 307, + 309, 310, 312, 313, 315, 316, 318, 319, 320, 321, + 322, 323, 324, 327, 328, 329, 330, 332, 333, 335, + 336, 337, 338, 339, 340, 342, 343, 345, 347, 348, + 350, 351, 352, 353, 354, 356, 357, 358, 359, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 454, 455, 456, 457, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 469, 470, 471, 472, 474, 475, 476, + 477, 478, 480, 481, 482, 484, 485, 487, 488, 489, + 490, 491, 492, 494, 495, 496, 497, 498, 500, 501, + 502, 503, 504, 505, 507, 508, 510, 511, 512, 514, + 515, 516, 518, 519, 520, 523, 524, 526, 527, 528, + 530, 532, 533, 534, 535, 537, 538, 539, 541, 542, + 543, 544, 545, 547, 548, 550, 551, 553, 554, 557, + 558, 559, 561, 562, 563, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581 }; #endif @@ -677,14 +680,14 @@ static const char *const yytname[] = "BITRANGE_KEY", "CHAR", "INTEGER", "INTB", "STRING", "SYMBOLSTRING", "SPACESYM", "SECTIONSYM", "TOKENSYM", "USEROPSYM", "VALUESYM", "VALUEMAPSYM", "CONTEXTSYM", "NAMESYM", "VARSYM", "BITSYM", "SPECSYM", - "VARLISTSYM", "OPERANDSYM", "STARTSYM", "ENDSYM", "MACROSYM", "LABELSYM", - "SUBTABLESYM", "'}'", "'='", "'('", "')'", "','", "'['", "']'", "'{'", - "':'", "' '", "$accept", "spec", "definition", "constructorlike", - "endiandef", "aligndef", "tokendef", "tokenprop", "contextdef", - "contextprop", "fielddef", "contextfielddef", "spacedef", "spaceprop", - "varnodedef", "bitrangedef", "bitrangelist", "bitrangesingle", - "pcodeopdef", "valueattach", "nameattach", "varattach", "macrodef", - "withblockstart", "withblockmid", "withblock", "id_or_nil", + "VARLISTSYM", "OPERANDSYM", "STARTSYM", "ENDSYM", "NEXT2SYM", "MACROSYM", + "LABELSYM", "SUBTABLESYM", "'}'", "'='", "'('", "')'", "','", "'['", + "']'", "'{'", "':'", "' '", "$accept", "spec", "definition", + "constructorlike", "endiandef", "aligndef", "tokendef", "tokenprop", + "contextdef", "contextprop", "fielddef", "contextfielddef", "spacedef", + "spaceprop", "varnodedef", "bitrangedef", "bitrangelist", + "bitrangesingle", "pcodeopdef", "valueattach", "nameattach", "varattach", + "macrodef", "withblockstart", "withblockmid", "withblock", "id_or_nil", "bitpat_or_nil", "macrostart", "rtlbody", "constructor", "constructprint", "subtablestart", "pexpression", "pequation", "elleq", "ellrt", "atomic", "constraint", "contextblock", "contextlist", @@ -714,97 +717,97 @@ static const yytype_uint16 yytoknum[] = 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 125, 61, 40, - 41, 44, 91, 93, 123, 58, 32 + 362, 363, 364, 365, 366, 367, 368, 369, 125, 61, + 40, 41, 44, 91, 93, 123, 58, 32 }; # endif -#define YYPACT_NINF -313 +#define YYPACT_NINF -316 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-313))) + (!!((Yystate) == (-316))) -#define YYTABLE_NINF -271 +#define YYTABLE_NINF -272 #define yytable_value_is_error(Yytable_value) \ - (!!((Yytable_value) == (-271))) + (!!((Yytable_value) == (-272))) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { - -42, 58, 3, -313, -37, -313, 5, -41, -5, 42, - 50, 25, 44, -313, -313, -313, -313, -313, 388, -313, - 419, -313, 317, -313, -313, -313, -313, -313, -313, -313, - -313, 37, -313, 59, -313, 23, 87, -45, -313, -313, - 2492, 71, 2510, -78, 90, 172, 197, 33, 33, 33, - 163, -313, -313, 182, -313, -313, -313, 200, -313, -313, - -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, - -313, -313, -313, -313, 351, 254, -313, 256, 291, 267, - -313, 269, -313, 290, 293, 308, -313, -313, -313, -313, - -313, 2336, -313, -313, -313, -313, 276, -313, 2336, -313, - -313, -313, 276, 417, 423, -313, -313, 331, 310, -313, - -313, 330, 444, -313, 327, 8, -313, 328, -313, -313, - 159, 322, -12, -84, 350, 2336, 329, -313, -313, -313, - 333, 334, -313, -313, -313, -313, 336, 249, 361, 362, - 341, 1662, 1481, -313, -313, -313, -313, -313, -313, 349, - -313, 2336, 4, -313, -313, 368, -313, 64, -313, 4, - -313, -313, 472, 376, -313, 2362, -313, 365, -313, -313, - -44, -313, -313, -57, 2528, 476, 381, -313, 16, 482, - -313, 54, 485, -313, -32, 364, 315, 389, 408, 418, - 420, -313, -313, -313, -313, -313, 264, -30, 179, -313, - 271, 1668, 1, 1530, 353, 393, 1561, 366, 406, 409, - 141, 428, -313, 430, -313, -313, -313, -313, 431, 74, - -313, 1530, -65, -313, 157, -313, 166, -313, 1689, 17, - 2336, 2336, 2336, -313, -59, -313, 1689, 1689, 1689, 1689, - 1689, 1689, -59, -313, 429, -313, -313, -313, 438, -313, - 474, -313, -313, -313, -313, -313, 2387, -313, -313, -313, - 466, -313, -313, -15, -313, -313, -313, 45, -313, -313, - 468, 439, 480, 484, 519, 520, -313, -313, 505, -313, - -313, 595, 635, 546, 581, -313, 559, -313, -313, -313, - -313, 1530, 686, -313, 1530, 723, -313, 1530, 1530, 1530, - 1530, 1530, 605, 638, 639, 647, 649, 680, 685, 688, - 690, 725, 728, 730, 765, 770, 805, 806, 810, 845, - -313, 1530, 1810, 1530, -313, -10, 0, 564, 627, 764, - 307, 840, 971, -313, 161, 1006, -313, 1011, 910, 1530, - 949, 1530, 1530, 1530, 1487, 950, 954, 1530, 989, 1689, - 1689, -313, 1689, 2369, -313, -313, -313, 325, 1084, -313, - 75, -313, -313, -313, 2369, 2369, 2369, 2369, 2369, 2369, - -313, 1023, 1029, 1046, -313, -313, -313, -313, 1030, -313, - -313, -313, -313, -313, -313, -313, -313, 1034, 1070, 1074, - 1109, 1561, -313, -313, 1082, -313, 1110, 326, -313, 563, - -313, 603, -313, -313, -313, -313, 1530, 1530, 1530, 1530, - 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, - 1530, 1530, 1530, 1530, 807, 1530, 1530, 1530, 1530, 1530, - 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, - 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, - 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, - 1530, 1627, -313, 11, 1149, 1150, -313, 1530, 1154, -313, - 1164, 299, 1190, -313, 1194, 1326, -313, 1331, -313, -313, - -313, -313, 1862, 1246, 2182, 36, 1902, 43, 1530, 1205, - 1251, 1942, 1244, -313, -313, 283, 1689, 1689, 1689, 1689, - 1689, 1689, 1689, 1689, 1689, 1285, -313, 1291, 1366, -313, - -313, -313, -18, 1371, 1284, 1349, -313, 1325, 1329, 1365, - 1402, -313, 1399, 1403, 1531, 1532, 1534, 847, 684, 887, - 724, 766, 927, 967, 1007, 1047, 1087, 1127, 1167, 1207, - 1247, 96, 643, 1287, 136, -313, 2221, 2258, 2258, 2292, - 2324, 2394, 2504, 2504, 2504, 2504, 2530, 2530, 2530, 2530, - 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 514, 514, - 514, 479, 479, 479, 479, -313, -313, -313, -313, -313, - -313, -313, 1535, 1408, 1413, -313, 1982, 9, 1537, 1538, - 1539, 1561, -313, -313, -313, 1530, 1540, 1530, -313, 1541, - 2022, -313, -313, -313, 1445, -313, 2431, 2561, 168, 383, - 383, 29, 29, -313, -313, 1622, 1689, 1689, 1597, 300, - -313, -313, 27, 1446, -78, -313, -313, -313, -313, 1449, - -313, -313, -313, -313, -313, 1530, -313, 1530, 1530, -313, - -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, - 1530, -313, -313, -313, -313, 1452, -313, -313, 1530, -313, - -313, -313, -313, 2062, -313, 2182, -313, -313, 1425, 1430, - 1431, 1523, 2360, -313, -313, 1568, 1569, -313, -313, 1434, - 1556, -313, 1327, 1367, 1407, 1447, 1435, 2102, -313, 1441, - 1455, 1456, -313, -313, -313, -313, -313, -313, -313, -313, - -313, -313, -313, -313, 1530, 1473, 1474, 2142, 1598, 1601, - -313, -313, -313 + -39, -23, 8, -316, -41, -316, 2, 88, 245, 0, + -38, -37, -14, -316, -316, -316, -316, -316, 426, -316, + 453, -316, 62, -316, -316, -316, -316, -316, -316, -316, + -316, 49, -316, 10, -316, 16, 191, 123, -316, -316, + 2427, 70, 2446, -21, 111, 189, 204, -61, -61, -61, + 173, -316, -316, 171, -316, -316, -316, 182, -316, -316, + -316, -316, -316, -316, -316, -316, -316, -316, -316, -316, + -316, -316, -316, -316, -316, 203, 185, -316, 193, 186, + 210, -316, 213, -316, 217, 231, 220, -316, -316, -316, + -316, -316, 211, -316, -316, -316, -316, 214, -316, 211, + -316, -316, -316, 214, 336, 347, -316, -316, 289, 267, + -316, -316, 297, 400, -316, 284, 55, -316, 295, -316, + -316, 159, 299, 47, -24, 315, 211, 308, -316, -316, + -316, 310, 349, -316, -316, -316, -316, 353, 215, 372, + 373, 364, 1692, 1754, -316, -316, -316, -316, -316, -316, + 369, -316, 211, 15, -316, -316, 395, -316, 26, -316, + 15, -316, -316, 492, 401, -316, 2302, -316, 396, -316, + -316, -57, -316, -316, -34, 2467, 497, 409, -316, 9, + 507, -316, -85, 509, -316, 261, 385, 190, 414, 415, + 417, 418, -316, -316, -316, -316, -316, 293, -70, 21, + -316, 388, 1613, 5, 1556, 226, 399, 1577, 304, 424, + 394, 50, 422, -316, 425, -316, -316, -316, -316, -316, + 429, -58, -316, 1556, -40, -316, 41, -316, 60, -316, + 1662, 27, 211, 211, 211, -316, -51, -316, 1662, 1662, + 1662, 1662, 1662, 1662, -51, -316, 441, -316, -316, -316, + 446, -316, 468, -316, -316, -316, -316, -316, 2328, -316, + -316, -316, 451, -316, -316, -13, -316, -316, -316, -43, + -316, -316, 450, 455, 449, 459, 461, 463, -316, -316, + 525, -316, -316, 613, 615, 526, 565, -316, 538, -316, + -316, -316, -316, -316, 1556, 665, -316, 1556, 667, -316, + 1556, 1556, 1556, 1556, 1556, 576, 577, 582, 585, 622, + 625, 658, 659, 669, 704, 709, 744, 749, 784, 785, + 820, 825, 826, -316, 1556, 1822, 1556, -316, 54, 3, + 584, 648, 703, 380, 661, 909, -316, 367, 952, -316, + 987, 770, 1556, 891, 1556, 1556, 1556, 1512, 895, 930, + 1556, 931, 1662, 1662, -316, 1662, 423, -316, -316, -316, + 167, 1029, -316, 187, -316, -316, -316, 423, 423, 423, + 423, 423, 423, -316, 995, 971, 992, -316, -316, -316, + -316, 972, -316, -316, -316, -316, -316, -316, -316, -316, + 976, 1011, 1012, 1051, 1577, -316, -316, 1023, -316, 1052, + 348, -316, 583, -316, 623, -316, -316, -316, -316, 1556, + 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, + 1556, 1556, 1556, 1556, 1556, 1556, 1556, 827, 1556, 1556, + 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, + 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, + 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, + 1556, 1556, 1556, 1556, 1700, -316, -8, 1087, 1092, -316, + 1556, 1093, -316, 1071, 85, 1132, -316, 1133, 1234, -316, + 1269, -316, -316, -316, -316, 1874, 1153, 2194, 271, 1914, + 275, 1556, 1147, 1184, 1954, 1186, -316, -316, 29, 1662, + 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1189, -316, + 1194, 1229, -316, -316, -316, 39, 1274, 1227, 1258, -316, + 1267, 1268, 1303, 1308, -316, 1304, 1310, 1471, 1476, 1511, + 867, 705, 907, 745, 787, 948, 988, 1028, 1069, 1109, + 1149, 1190, 1230, 1270, 287, 663, 1311, 305, -316, 2233, + 2270, 2270, 2304, 2336, 2366, 2465, 2465, 2465, 2465, 2491, + 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, + 2491, 2575, 2575, 2575, 408, 408, 408, 408, -316, -316, + -316, -316, -316, -316, -316, 1516, 1349, 1388, -316, 1994, + 4, 1549, 1551, 1553, 1577, -316, -316, -316, 1556, 1554, + 1556, -316, 1557, 2034, -316, -316, -316, 1459, -316, 2444, + 2435, 495, 273, 273, 421, 421, -316, -316, 2482, 1662, + 1662, 1626, 117, -316, -316, 387, 1461, -21, -316, -316, + -316, -316, 1463, -316, -316, -316, -316, -316, 1556, -316, + 1556, 1556, -316, -316, -316, -316, -316, -316, -316, -316, + -316, -316, -316, 1556, -316, -316, -316, -316, 1464, -316, + -316, 1556, -316, -316, -316, -316, 2074, -316, 2194, -316, + -316, 1436, 1439, 1440, 1548, 1615, -316, -316, 1543, 1544, + -316, -316, 1441, 1568, -316, 1351, 1391, 1432, 1472, 1445, + 2114, -316, 1453, 1468, 1475, -316, -316, -316, -316, -316, + -316, -316, -316, -316, -316, -316, -316, 1556, 1455, 1456, + 2154, 1585, 1586, -316, -316, -316 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -817,99 +820,99 @@ static const yytype_uint16 yydefact[] = 0, 8, 0, 9, 10, 11, 12, 13, 14, 17, 63, 0, 18, 0, 16, 0, 0, 0, 15, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 69, 68, 0, 88, 87, 23, 0, 323, 324, - 325, 326, 329, 330, 331, 332, 333, 338, 334, 335, - 336, 337, 327, 328, 27, 0, 29, 0, 31, 0, - 43, 0, 50, 0, 0, 0, 66, 64, 65, 145, - 82, 0, 282, 83, 86, 85, 84, 81, 0, 78, - 80, 90, 79, 0, 0, 44, 45, 0, 0, 28, - 294, 0, 0, 30, 0, 0, 54, 0, 304, 305, - 0, 0, 0, 0, 320, 70, 0, 34, 35, 36, - 0, 0, 39, 40, 41, 42, 0, 0, 0, 0, - 0, 140, 0, 272, 273, 274, 275, 124, 276, 123, - 126, 0, 127, 106, 111, 113, 114, 125, 283, 127, - 20, 21, 0, 0, 295, 0, 57, 0, 53, 55, - 0, 306, 307, 0, 0, 0, 0, 285, 0, 0, - 312, 0, 0, 321, 0, 127, 71, 0, 0, 0, - 0, 46, 47, 48, 49, 61, 0, 0, 243, 257, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, - 254, 0, 277, 0, 278, 279, 280, 281, 0, 255, - 146, 0, 0, 253, 0, 173, 252, 110, 0, 0, - 0, 0, 0, 129, 0, 112, 0, 0, 0, 0, - 0, 0, 0, 22, 0, 296, 293, 297, 0, 52, - 0, 310, 308, 309, 303, 299, 0, 300, 59, 286, - 0, 287, 289, 0, 58, 314, 313, 0, 60, 72, - 0, 0, 0, 0, 0, 0, 254, 255, 0, 259, - 252, 0, 0, 0, 0, 247, 246, 251, 248, 244, - 245, 0, 0, 250, 0, 0, 170, 0, 0, 0, + 0, 69, 68, 0, 88, 87, 23, 0, 325, 326, + 327, 328, 331, 332, 333, 334, 335, 341, 336, 337, + 338, 339, 340, 329, 330, 27, 0, 29, 0, 31, + 0, 43, 0, 50, 0, 0, 0, 66, 64, 65, + 145, 82, 0, 284, 83, 86, 85, 84, 81, 0, + 78, 80, 90, 79, 0, 0, 44, 45, 0, 0, + 28, 296, 0, 0, 30, 0, 0, 54, 0, 306, + 307, 0, 0, 0, 0, 322, 70, 0, 34, 35, + 36, 0, 0, 39, 40, 41, 42, 0, 0, 0, + 0, 0, 140, 0, 273, 274, 275, 276, 124, 277, + 123, 126, 0, 127, 106, 111, 113, 114, 125, 285, + 127, 20, 21, 0, 0, 297, 0, 57, 0, 53, + 55, 0, 308, 309, 0, 0, 0, 0, 287, 0, + 0, 314, 0, 0, 323, 0, 127, 71, 0, 0, + 0, 0, 46, 47, 48, 49, 61, 0, 0, 243, + 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 257, 255, 0, 278, 0, 279, 280, 281, 282, 283, + 0, 256, 146, 0, 0, 254, 0, 173, 253, 110, + 0, 0, 0, 0, 0, 129, 0, 112, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 298, 295, 299, + 0, 52, 0, 312, 310, 311, 305, 301, 0, 302, + 59, 288, 0, 289, 291, 0, 58, 316, 315, 0, + 60, 72, 0, 0, 0, 0, 0, 0, 255, 256, + 0, 260, 253, 0, 0, 0, 0, 248, 247, 252, + 249, 244, 245, 246, 0, 0, 251, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 0, 174, 252, 0, 0, 0, 0, - 0, 0, 143, 271, 0, 0, 266, 0, 0, 0, - 0, 317, 0, 317, 0, 0, 0, 0, 0, 0, - 0, 91, 0, 122, 92, 93, 115, 108, 109, 107, - 0, 75, 145, 76, 117, 118, 120, 121, 119, 116, - 77, 24, 0, 0, 301, 298, 302, 288, 0, 290, - 292, 284, 316, 315, 311, 322, 62, 0, 0, 0, - 0, 0, 265, 264, 0, 242, 0, 0, 165, 0, - 168, 0, 189, 216, 202, 190, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 0, 174, 253, 0, + 0, 0, 0, 0, 0, 143, 272, 0, 0, 267, + 0, 0, 0, 0, 319, 0, 319, 0, 0, 0, + 0, 0, 0, 0, 91, 0, 122, 92, 93, 115, + 108, 109, 107, 0, 75, 145, 76, 117, 118, 120, + 121, 119, 116, 77, 24, 0, 0, 303, 300, 304, + 290, 0, 292, 294, 286, 318, 317, 313, 324, 62, + 0, 0, 0, 0, 0, 266, 265, 0, 242, 0, + 0, 165, 0, 168, 0, 189, 216, 202, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 317, 0, 0, 317, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 319, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 175, 0, 0, 0, 147, 0, 0, 154, - 0, 0, 0, 267, 0, 144, 263, 0, 261, 141, - 161, 258, 0, 0, 318, 0, 0, 0, 0, 0, - 0, 0, 0, 104, 105, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 134, 0, 0, 128, - 138, 145, 0, 0, 0, 0, 291, 0, 0, 0, - 0, 260, 241, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 175, 0, 0, 0, 147, + 0, 0, 154, 0, 0, 0, 268, 0, 144, 264, + 0, 262, 141, 161, 259, 0, 0, 320, 0, 0, + 0, 0, 0, 0, 0, 0, 104, 105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, + 0, 0, 128, 138, 145, 0, 0, 0, 0, 293, + 0, 0, 0, 0, 261, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 176, 205, 204, 203, 193, - 191, 192, 179, 180, 206, 207, 181, 184, 182, 183, - 185, 186, 187, 188, 208, 209, 210, 211, 194, 195, - 196, 177, 178, 212, 213, 197, 198, 200, 199, 201, - 214, 215, 0, 0, 0, 235, 0, 0, 0, 0, - 0, 0, 269, 142, 151, 0, 0, 0, 158, 0, - 0, 160, 159, 149, 0, 94, 101, 102, 100, 98, - 99, 95, 96, 97, 103, 0, 0, 0, 0, 0, - 73, 137, 0, 0, 0, 32, 33, 37, 38, 0, - 249, 167, 169, 171, 220, 0, 219, 0, 0, 226, - 217, 218, 228, 229, 230, 225, 224, 227, 239, 231, - 0, 233, 238, 166, 234, 0, 150, 148, 0, 164, - 163, 162, 268, 0, 156, 319, 172, 155, 0, 0, - 0, 0, 0, 74, 139, 0, 0, 26, 25, 0, - 0, 240, 0, 0, 0, 0, 0, 0, 153, 0, - 0, 0, 130, 133, 135, 136, 56, 51, 221, 222, - 223, 232, 236, 152, 0, 0, 0, 0, 0, 0, - 157, 131, 132 + 0, 0, 0, 0, 0, 0, 0, 0, 176, 205, + 204, 203, 193, 191, 192, 179, 180, 206, 207, 181, + 184, 182, 183, 185, 186, 187, 188, 208, 209, 210, + 211, 194, 195, 196, 177, 178, 212, 213, 197, 198, + 200, 199, 201, 214, 215, 0, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 270, 142, 151, 0, 0, + 0, 158, 0, 0, 160, 159, 149, 0, 94, 101, + 102, 100, 98, 99, 95, 96, 97, 103, 0, 0, + 0, 0, 0, 73, 137, 0, 0, 0, 32, 33, + 37, 38, 0, 250, 167, 169, 171, 220, 0, 219, + 0, 0, 226, 217, 218, 228, 229, 230, 225, 224, + 227, 239, 231, 0, 233, 238, 166, 234, 0, 150, + 148, 0, 164, 163, 162, 269, 0, 156, 321, 172, + 155, 0, 0, 0, 0, 0, 74, 139, 0, 0, + 26, 25, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 153, 0, 0, 0, 130, 133, 135, 136, 56, + 51, 221, 222, 223, 232, 236, 152, 0, 0, 0, + 0, 0, 0, 157, 131, 132 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -313, -313, 1574, 1580, -313, -313, -313, -313, -313, -313, - -313, -313, -313, -313, -313, -313, -313, 1497, -313, -313, - -313, -313, -313, -313, -313, -313, -313, -313, -313, 1374, - -313, -313, -313, -194, -62, -313, 1471, -313, -313, -132, - -313, 999, -313, -313, 1256, 1108, -313, -197, -140, -196, - -127, 1157, 1288, -139, -313, -91, -53, 1585, -313, -313, - 1001, -313, -313, -313, 252, -313, -313, -313, -312, -313, - 15 + -316, -316, 1564, 1565, -316, -316, -316, -316, -316, -316, + -316, -316, -316, -316, -316, -316, -316, 1481, -316, -316, + -316, -316, -316, -316, -316, -316, -316, -316, -316, 1354, + -316, -316, -316, -224, -69, -316, 1477, -316, -316, -73, + -316, 1000, -316, -316, 1259, 1112, -316, -199, -141, -198, + -60, 1162, 1292, -140, -316, -92, -36, 1595, -316, -316, + 1005, -316, -316, -316, 427, -316, -316, -316, -315, -316, + 7 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 2, 14, 15, 3, 16, 17, 18, 19, 20, - 74, 78, 21, 22, 23, 24, 115, 116, 25, 26, - 27, 28, 29, 30, 31, 32, 53, 185, 33, 363, - 34, 35, 36, 353, 152, 153, 154, 155, 156, 234, - 360, 621, 510, 511, 140, 141, 220, 484, 323, 292, - 324, 223, 224, 293, 335, 354, 325, 96, 179, 263, - 112, 165, 175, 256, 121, 173, 182, 267, 485, 184, - 75 + 75, 79, 21, 22, 23, 24, 116, 117, 25, 26, + 27, 28, 29, 30, 31, 32, 53, 186, 33, 366, + 34, 35, 36, 356, 153, 154, 155, 156, 157, 236, + 363, 624, 513, 514, 141, 142, 222, 487, 326, 295, + 327, 225, 226, 296, 338, 357, 328, 97, 180, 265, + 113, 166, 176, 258, 122, 174, 183, 269, 488, 185, + 76 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -917,659 +920,652 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 157, 221, 225, 5, 6, 295, 322, 157, 466, 296, - 230, 619, 231, 38, 222, 232, 168, 657, 378, 249, - 361, 176, 196, 230, 344, 231, 1, 242, 232, 110, - 40, 487, 90, 180, 157, 79, 159, 41, 6, 42, - 103, 104, 364, 365, 366, 367, 368, 369, 181, 260, - 251, 157, 43, 271, 111, 106, 252, 109, 253, 44, - 157, 250, 45, 186, 345, 503, 504, 334, 46, 279, - 346, 7, 8, 9, 199, 362, 254, 281, 236, 329, - 10, 237, 238, 239, 240, 47, 48, 49, 226, 229, - 379, 37, 380, 177, 397, 282, 97, 399, 269, 270, - 401, 402, 403, 404, 405, 85, 8, 9, 541, 620, - 11, 544, 677, 678, 10, 114, 209, 91, 381, 463, - 178, 261, 464, 262, 424, 465, 462, 92, 467, 12, - 93, 94, 39, 297, 4, 468, 233, 658, 13, 157, - 157, 157, 482, 280, 11, 486, 118, 356, 119, 50, - 491, 327, 382, 280, 336, 493, 494, 51, 495, 95, - 54, 265, 383, 12, 86, 120, 596, 597, 357, 358, - 359, 266, 13, 599, 597, 355, 52, 505, 384, 55, - 247, 98, 506, 355, 355, 355, 355, 355, 355, 257, - 507, 92, 241, 89, 99, 100, 508, 499, 500, 107, - 501, 502, -263, 473, 503, 504, -263, 113, 509, 527, - 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, - 538, 539, 540, 101, 542, 543, 648, 597, 546, 547, - 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, - 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 521, 582, 652, 597, 475, 339, - 586, 376, 171, -262, 172, 196, 340, 280, 212, 114, - 214, 478, 215, 216, 217, 347, 117, 476, 197, 348, - 496, 600, 124, 497, -261, 498, 355, 355, -261, 355, - 122, 123, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 283, 499, 500, 284, 501, 502, 125, 196, 503, - 504, 230, 191, 231, 192, 80, 232, 199, 126, 425, - 426, 427, 428, 231, 285, 429, 232, 430, 280, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 209, - 199, 276, 132, 133, 134, 135, 286, 330, 287, 40, - 158, 212, 130, 214, 131, 215, 216, 217, 42, 81, - 277, 82, 288, 289, 290, 136, 56, 137, 663, 278, - 665, 43, 198, 291, 83, 84, 589, 675, 44, 590, - 676, 45, 209, 605, 276, 501, 502, 46, 138, 503, - 504, 139, 671, 672, 212, 160, 214, 76, 215, 216, - 217, 161, 127, 277, 128, 129, 162, 164, 682, 163, - 683, 684, 472, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 166, 685, 174, 167, 170, 183, 187, 524, - 326, 687, 188, 189, 662, 190, 193, 194, 195, 235, - 212, 331, 214, 332, 215, 216, 217, 228, 221, 225, - 243, 244, 248, 212, 258, 214, 259, 215, 216, 217, - 264, 222, 333, 268, 272, 57, 233, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 707, 68, 69, - 70, 71, 72, 273, 73, 454, 455, 456, 457, 458, - 459, 460, 328, 274, 669, 275, 77, 337, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 280, 68, - 69, 70, 71, 72, 338, 73, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 341, 342, 371, - 343, 373, 670, 355, 355, 226, 425, 426, 427, 428, - 372, 377, 429, 386, 430, 385, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 425, 426, 427, 428, - 391, 387, 429, 392, 430, 388, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 425, 426, 427, 428, - 389, 390, 429, 393, 430, 394, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 395, 425, 426, 427, - 428, 396, 469, 429, 398, 430, 525, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 425, 426, 427, - 428, 400, 470, 429, 406, 430, 526, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 407, 408, 425, - 426, 427, 428, 649, 650, 429, 409, 430, 410, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 411, - 425, 426, 427, 428, 412, 635, 429, 413, 430, 414, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 415, 637, 429, 416, 430, 417, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 418, 471, 429, 638, 430, 419, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 420, 421, 429, 545, 430, 422, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 423, 474, 429, 634, 430, -270, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 479, 481, 429, 636, 430, 480, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 483, 489, 429, 639, 430, 490, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 492, 232, 429, 640, 430, 513, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 514, 516, 429, 641, 430, 517, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 515, 518, 429, 642, 430, 519, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 520, 522, 429, 643, 430, 523, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 584, 585, 429, 644, 430, 587, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 588, 591, 429, 645, 430, 592, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, -262, 601, 429, 646, 430, 593, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 595, 604, 429, 647, 430, 602, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 615, 623, 429, 651, 430, 616, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 624, 625, 429, 698, 430, 626, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 425, 426, 427, 428, 617, 627, 429, 699, 430, 622, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 496, 692, 628, 497, 629, 498, 630, 700, 654, 631, - 632, 196, 633, 653, 655, 659, 660, 661, 664, 666, - 668, 679, 499, 500, 681, 501, 502, 686, 689, 503, - 504, 690, 691, 298, 697, 299, 198, 696, 702, 704, - 705, 706, 196, 300, 301, 302, 303, 701, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 199, 143, 144, 145, 146, 694, 695, - 147, 148, 149, 708, 709, 87, 711, 150, 196, 712, - 151, 88, 169, 227, 197, 488, 370, 674, 512, 618, - 583, 102, 477, 0, 199, 680, 619, 0, 0, 0, - 0, 0, 0, 198, 0, 209, 0, 276, 0, 0, - 0, 0, 319, 0, 197, 0, 0, 212, 320, 214, - 0, 215, 216, 217, 0, 0, 277, 0, 0, 321, - 199, 200, 201, 202, 203, 0, 209, 0, 276, 0, - 0, 0, 0, 196, 0, 0, 0, 0, 212, 197, - 214, 0, 215, 216, 217, 197, 0, 277, 0, 0, - 285, 0, 204, 205, 206, 0, 208, 0, 198, 0, - 0, 0, 209, 0, 210, 0, 0, 0, 0, 211, - 0, 0, 0, 0, 212, 213, 214, 0, 215, 216, - 217, 218, 349, 219, 673, 199, 200, 201, 202, 203, - 0, 285, 286, 350, 287, 143, 144, 145, 146, 212, - 0, 214, 148, 215, 216, 217, 0, 0, 288, 289, - 290, 0, 0, 0, 0, 0, 0, 204, 205, 206, - 207, 208, 0, 0, 0, 0, 0, 209, 0, 210, - 0, 0, 0, 286, 211, 287, 0, 0, 0, 212, - 213, 214, 0, 215, 216, 217, 218, 0, 219, 288, - 289, 290, 0, 0, 0, 351, 0, 0, 0, 0, - 294, 0, 143, 144, 145, 146, 212, 0, 214, 148, - 215, 216, 217, 425, 426, 427, 428, 0, 352, 429, - 0, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 158, 223, 227, 197, 298, 325, 251, 158, 5, 6, + 38, 469, 660, 299, 367, 368, 369, 370, 371, 372, + 381, 232, 267, 233, 347, 91, 234, 80, 364, 1, + 160, 490, 268, 232, 158, 233, 499, 283, 234, 500, + 238, 501, 262, 239, 240, 241, 242, 107, 252, 110, + 6, 158, 119, 4, 120, 200, 284, 187, 502, 503, + 158, 504, 505, 169, 385, 506, 507, 337, 622, 51, + 81, -264, 121, 253, 386, -264, 7, 8, 9, 254, + 177, 255, 224, 231, 365, 10, 111, 244, 37, 52, + 348, 387, 382, 181, 383, 400, 349, 210, 402, 54, + 256, 404, 405, 406, 407, 408, 228, 50, 544, 182, + 92, 547, 112, 273, 263, 11, 264, 86, 8, 9, + 93, 384, 55, 94, 95, 427, 10, 465, 496, 497, + 39, 498, 470, 661, 82, 12, 83, 281, 300, 471, + 158, 158, 158, 485, 13, 90, 489, 332, 235, 84, + 85, 494, 178, 96, 285, 243, 11, 286, 359, 40, + 608, 282, 115, 360, 361, 362, 41, 623, 42, 330, + 350, 282, 339, 249, 351, 233, 12, 87, 234, 342, + 179, 43, 259, -263, 466, 13, 343, 467, 44, -262, + 468, 45, 592, -262, 358, 593, 232, 46, 233, 108, + 98, 234, 358, 358, 358, 358, 358, 358, 104, 105, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 678, 545, 546, 679, 114, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 379, 585, 133, 134, 135, + 136, 589, 172, 476, 173, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 128, 99, 129, 130, 192, 508, + 193, 40, 603, 118, 509, 93, 115, 282, 100, 101, + 42, 481, 510, 125, 197, 504, 505, 126, 511, 506, + 507, 127, 143, 43, 131, 333, 358, 358, 159, 358, + 44, 512, 132, 45, 144, 145, 146, 147, 102, 46, + 148, 149, 150, 329, 524, 47, 48, 49, 151, 137, + 199, 152, 138, 213, 161, 215, 139, 216, 217, 218, + 219, 428, 429, 430, 431, 162, 200, 432, 282, 433, + 140, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 197, 271, 272, 163, 674, 675, 164, 210, 666, + 278, 668, 599, 600, 165, 198, 602, 600, 167, 334, + 213, 335, 215, 168, 216, 217, 218, 219, 651, 600, + 279, 213, 184, 215, 171, 216, 217, 218, 219, 280, + 499, 336, 175, 500, 56, 501, 655, 600, 188, 685, + 189, 686, 687, 200, 457, 458, 459, 460, 461, 462, + 463, 287, 502, 503, 688, 504, 505, 506, 507, 506, + 507, 77, 690, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 680, 681, 478, 123, 124, 194, 195, 190, + 223, 227, 527, 191, 213, 210, 215, 278, 216, 217, + 218, 219, 196, 288, 479, 289, 237, 213, 230, 215, + 245, 216, 217, 218, 219, 260, 246, 279, 710, 290, + 291, 292, 293, 250, 261, 266, 475, 270, 235, 274, + 275, 294, 276, 277, 502, 503, 672, 504, 505, 331, + 341, 506, 507, 57, 665, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 340, 68, 69, 70, 71, + 72, 73, 344, 74, 345, 376, 380, 388, 282, 346, + 78, 224, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 374, 68, 69, 70, 71, 72, 73, 375, + 74, 390, 673, 358, 358, 228, 428, 429, 430, 431, + 389, 391, 432, 392, 433, 393, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 425, 426, 427, 428, 0, - 594, 429, 0, 430, 461, 431, 432, 433, 434, 435, + 458, 459, 460, 461, 462, 463, 428, 429, 430, 431, + 394, 395, 432, 396, 433, 397, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 428, 429, 430, 431, + 398, 399, 432, 401, 433, 403, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 409, 410, 428, 429, + 430, 431, 411, 472, 432, 412, 433, 528, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 598, 429, 0, 430, 0, 431, 432, 433, 434, 435, + 456, 457, 458, 459, 460, 461, 462, 463, 428, 429, + 430, 431, 413, 473, 432, 414, 433, 529, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 603, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 656, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 667, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 688, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 703, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 710, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 425, 426, 427, 428, 0, - 0, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 426, 427, 428, 0, 0, - 429, 0, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, - 457, 458, 459, 460, 428, 0, 0, 429, 0, 430, - 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 456, 457, 458, 459, 460, 461, 462, 463, 415, 416, + 428, 429, 430, 431, 652, 653, 432, 477, 433, 417, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 428, 429, 430, 431, 418, 474, 432, 638, 433, 419, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 428, 429, 430, 431, 420, 484, 432, 640, 433, 421, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 428, 429, 430, 431, 422, 423, 432, -271, 433, 641, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 424, 428, 429, 430, 431, 425, 426, 432, 548, 433, + 482, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 428, 429, 430, 431, 483, 486, 432, 637, 433, + 492, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 428, 429, 430, 431, 493, 495, 432, 639, 433, + 234, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 516, 428, 429, 430, 431, 517, 519, 432, 642, + 433, 520, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 428, 429, 430, 431, 521, 522, 432, 643, + 433, 518, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 428, 429, 430, 431, 523, 525, 432, 644, + 433, 526, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 587, 428, 429, 430, 431, 588, 590, 432, + 645, 433, 591, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 428, 429, 430, 431, 594, 595, 432, + 646, 433, -263, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 428, 429, 430, 431, 596, 604, 432, + 647, 433, 598, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 605, 428, 429, 430, 431, 607, 618, + 432, 648, 433, 619, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 429, 0, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 496, 693, 0, - 497, 0, 498, 0, 0, 0, 496, 0, 0, 497, - 0, 498, 0, 0, 0, 0, 0, 0, 0, 499, - 500, 0, 501, 502, 0, 0, 503, 504, 499, 500, - 0, 501, 502, 0, 0, 503, 504, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 142, 0, 0, - 0, 497, 0, 498, 0, 0, 0, 0, 0, 143, - 144, 145, 146, 0, 0, 147, 148, 149, 0, 0, - 499, 500, 150, 501, 502, 151, 0, 503, 504, 245, - 0, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 68, 69, 70, 71, 72, 0, 73, 0, - 0, 0, 0, 0, 374, 246, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 0, 68, 69, 70, - 71, 72, 0, 73, 0, 0, 0, 0, 0, 0, - 375, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, -271, -271, -271, - -271, -271, -271, -271, -271, -271, -271, -271, -271, 447, + 460, 461, 462, 463, 428, 429, 430, 431, 620, 626, + 432, 649, 433, 627, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 428, 429, 430, 431, 628, 629, + 432, 650, 433, 625, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 630, 428, 429, 430, 431, 631, + 632, 432, 654, 433, 633, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 428, 429, 430, 431, 634, + 657, 432, 701, 433, 635, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 428, 429, 430, 431, 636, + 658, 432, 702, 433, 656, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 499, 695, 662, 500, 663, + 501, 664, 667, 703, 671, 669, 682, 197, 684, 689, + 692, 693, 694, 697, 698, 699, 700, 502, 503, 705, + 504, 505, 707, 708, 506, 507, 711, 712, 197, 301, + 709, 302, 199, 714, 715, 88, 89, 170, 373, 303, + 304, 305, 306, 704, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 200, + 229, 677, 499, 696, 515, 500, 621, 501, 586, 480, + 198, 103, 683, 0, 0, 0, 0, 197, 0, 0, + 200, 491, 0, 198, 502, 503, 0, 504, 505, 0, + 0, 506, 507, 0, 0, 622, 0, 0, 0, 0, + 0, 210, 199, 278, 0, 0, 0, 0, 322, 0, + 0, 0, 0, 213, 323, 215, 287, 216, 217, 218, + 219, 0, 210, 279, 278, 0, 324, 0, 0, 200, + 201, 202, 203, 204, 213, 352, 215, 0, 216, 217, + 218, 219, 0, 197, 279, 0, 353, 0, 0, 198, + 0, 0, 0, 0, 0, 0, 0, 198, 288, 0, + 289, 205, 206, 207, 0, 209, 0, 0, 199, 0, + 0, 210, 0, 211, 290, 291, 292, 293, 212, 0, + 0, 0, 0, 213, 214, 215, 297, 216, 217, 218, + 219, 220, 0, 221, 676, 200, 201, 202, 203, 204, + 0, 0, 0, 287, 0, 0, 0, 0, 354, 0, + 0, 0, 0, 0, 0, 144, 145, 146, 147, 213, + 0, 215, 149, 216, 217, 218, 219, 205, 206, 207, + 208, 209, 355, 0, 0, 0, 0, 210, 0, 211, + 0, 0, 0, 0, 212, 288, 0, 289, 0, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 0, 221, + 0, 290, 291, 292, 293, 428, 429, 430, 431, 0, + 0, 432, 0, 433, 0, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 0, 0, 144, 145, 146, + 147, 0, 0, 148, 149, 150, 0, 428, 429, 430, + 431, 151, 597, 432, 152, 433, 464, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 601, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 606, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 659, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 670, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 691, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 706, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 713, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 428, 429, 430, + 431, 0, 0, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 429, 430, 431, + 0, 0, 432, 0, 433, 0, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 498, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 499, 500, 0, 501, 502, 0, 0, 503, 504, 105, + 458, 459, 460, 461, 462, 463, 431, 0, 0, 432, + 0, 433, 0, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 432, 0, 433, 0, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 433, 0, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 247, 0, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 68, 69, 70, 71, 72, 108, 73, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, - 68, 69, 70, 71, 72, 255, 73, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 0, 68, 69, - 70, 71, 72, 0, 73 + 67, 0, 68, 69, 70, 71, 72, 73, 0, 74, + 0, 0, 0, 0, 0, 377, 248, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 501, 68, 69, + 70, 71, 72, 73, 500, 74, 501, 0, 0, 0, + 0, 0, 378, 0, 502, 503, 0, 504, 505, 0, + 0, 506, 507, 502, 503, 0, 504, 505, 0, 0, + 506, 507, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, -272, -272, + -272, -272, -272, -272, -272, -272, -272, -272, -272, -272, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 106, 0, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 0, 68, 69, 70, + 71, 72, 73, 109, 74, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 0, 68, 69, 70, 71, + 72, 73, 0, 74, 257, 0, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 0, 68, 69, 70, + 71, 72, 73, 0, 74, 144, 145, 146, 147, 213, + 0, 215, 149, 216, 217, 218, 219, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463 }; static const yytype_int16 yycheck[] = { - 91, 141, 141, 0, 1, 201, 203, 98, 8, 8, - 6, 29, 8, 8, 141, 11, 8, 8, 33, 63, - 79, 33, 11, 6, 221, 8, 68, 159, 11, 107, - 71, 343, 9, 117, 125, 20, 98, 78, 1, 80, - 85, 86, 236, 237, 238, 239, 240, 241, 132, 33, - 107, 142, 93, 185, 132, 40, 113, 42, 115, 100, - 151, 105, 103, 125, 129, 36, 37, 207, 109, 196, - 135, 68, 69, 70, 63, 134, 133, 107, 14, 206, - 77, 17, 18, 19, 20, 90, 91, 92, 141, 151, - 105, 128, 107, 105, 291, 125, 9, 294, 130, 131, - 297, 298, 299, 300, 301, 68, 69, 70, 420, 127, - 107, 423, 85, 86, 77, 107, 105, 94, 133, 129, - 132, 105, 132, 107, 321, 135, 323, 104, 128, 126, - 107, 108, 127, 132, 76, 135, 132, 128, 135, 230, - 231, 232, 339, 196, 107, 342, 113, 130, 115, 107, - 347, 204, 107, 206, 207, 349, 350, 107, 352, 136, - 135, 107, 117, 126, 127, 132, 130, 131, 230, 231, - 232, 117, 135, 130, 131, 228, 126, 102, 133, 135, - 165, 94, 107, 236, 237, 238, 239, 240, 241, 174, - 115, 104, 128, 134, 107, 108, 121, 29, 30, 128, - 32, 33, 128, 330, 36, 37, 132, 117, 133, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 136, 421, 422, 130, 131, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, - 457, 458, 459, 460, 391, 461, 130, 131, 107, 128, - 467, 256, 113, 132, 115, 11, 135, 330, 117, 107, - 119, 334, 121, 122, 123, 128, 89, 126, 17, 132, - 7, 488, 129, 10, 128, 12, 349, 350, 132, 352, - 48, 49, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 132, 29, 30, 135, 32, 33, 135, 11, 36, - 37, 6, 73, 8, 75, 8, 11, 63, 128, 3, - 4, 5, 6, 8, 63, 9, 11, 11, 391, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 105, - 63, 107, 81, 82, 83, 84, 105, 11, 107, 71, - 104, 117, 128, 119, 128, 121, 122, 123, 80, 72, - 126, 74, 121, 122, 123, 128, 8, 128, 595, 135, - 597, 93, 36, 132, 87, 88, 107, 107, 100, 110, - 110, 103, 105, 130, 107, 32, 33, 109, 128, 36, - 37, 128, 616, 617, 117, 8, 119, 8, 121, 122, - 123, 8, 81, 126, 83, 84, 105, 107, 635, 129, - 637, 638, 135, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 8, 650, 132, 128, 128, 107, 129, 133, - 107, 658, 129, 129, 591, 129, 105, 105, 127, 101, - 117, 105, 119, 107, 121, 122, 123, 128, 618, 618, - 8, 105, 117, 117, 8, 119, 105, 121, 122, 123, - 8, 618, 126, 8, 105, 107, 132, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 704, 120, 121, - 122, 123, 124, 105, 126, 36, 37, 38, 39, 40, - 41, 42, 129, 105, 615, 105, 107, 121, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 591, 120, - 121, 122, 123, 124, 135, 126, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 129, 128, 130, - 129, 87, 615, 616, 617, 618, 3, 4, 5, 6, - 132, 105, 9, 134, 11, 107, 13, 14, 15, 16, + 92, 142, 142, 11, 202, 204, 63, 99, 0, 1, + 8, 8, 8, 8, 238, 239, 240, 241, 242, 243, + 33, 6, 107, 8, 223, 9, 11, 20, 79, 68, + 99, 346, 117, 6, 126, 8, 7, 107, 11, 10, + 14, 12, 33, 17, 18, 19, 20, 40, 105, 42, + 1, 143, 113, 76, 115, 63, 126, 126, 29, 30, + 152, 32, 33, 8, 107, 36, 37, 208, 29, 107, + 8, 129, 133, 107, 117, 133, 68, 69, 70, 113, + 33, 115, 142, 152, 135, 77, 107, 160, 129, 127, + 130, 134, 105, 117, 107, 294, 136, 105, 297, 136, + 134, 300, 301, 302, 303, 304, 142, 107, 423, 133, + 94, 426, 133, 186, 105, 107, 107, 68, 69, 70, + 104, 134, 136, 107, 108, 324, 77, 326, 352, 353, + 128, 355, 129, 129, 72, 127, 74, 197, 133, 136, + 232, 233, 234, 342, 136, 135, 345, 207, 133, 87, + 88, 350, 105, 137, 133, 129, 107, 136, 131, 71, + 131, 197, 107, 232, 233, 234, 78, 128, 80, 205, + 129, 207, 208, 166, 133, 8, 127, 128, 11, 129, + 133, 93, 175, 133, 130, 136, 136, 133, 100, 129, + 136, 103, 107, 133, 230, 110, 6, 109, 8, 129, + 9, 11, 238, 239, 240, 241, 242, 243, 85, 86, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 107, 424, 425, 110, 117, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 258, 464, 81, 82, 83, + 84, 470, 113, 333, 115, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 81, 94, 83, 84, 73, 102, + 75, 71, 491, 89, 107, 104, 107, 333, 107, 108, + 80, 337, 115, 130, 11, 32, 33, 136, 121, 36, + 37, 129, 101, 93, 129, 11, 352, 353, 104, 355, + 100, 134, 129, 103, 113, 114, 115, 116, 137, 109, + 119, 120, 121, 107, 394, 90, 91, 92, 127, 129, + 36, 130, 129, 117, 8, 119, 129, 121, 122, 123, + 124, 3, 4, 5, 6, 8, 63, 9, 394, 11, + 129, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 11, 131, 132, 105, 619, 620, 130, 105, 598, + 107, 600, 131, 132, 107, 17, 131, 132, 8, 105, + 117, 107, 119, 129, 121, 122, 123, 124, 131, 132, + 127, 117, 107, 119, 129, 121, 122, 123, 124, 136, + 7, 127, 133, 10, 8, 12, 131, 132, 130, 638, + 130, 640, 641, 63, 36, 37, 38, 39, 40, 41, + 42, 63, 29, 30, 653, 32, 33, 36, 37, 36, + 37, 8, 661, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 85, 86, 107, 48, 49, 105, 105, 130, + 621, 621, 134, 130, 117, 105, 119, 107, 121, 122, + 123, 124, 128, 105, 127, 107, 101, 117, 129, 119, + 8, 121, 122, 123, 124, 8, 105, 127, 707, 121, + 122, 123, 124, 117, 105, 8, 136, 8, 133, 105, + 105, 133, 105, 105, 29, 30, 618, 32, 33, 130, + 136, 36, 37, 107, 594, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 121, 120, 121, 122, 123, + 124, 125, 130, 127, 129, 87, 105, 107, 594, 130, + 107, 621, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 131, 120, 121, 122, 123, 124, 125, 133, + 127, 132, 618, 619, 620, 621, 3, 4, 5, 6, + 135, 132, 9, 132, 11, 132, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, 6, - 105, 131, 9, 18, 11, 131, 13, 14, 15, 16, + 105, 18, 9, 18, 11, 109, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, 6, - 131, 131, 9, 18, 11, 109, 13, 14, 15, 16, + 105, 133, 9, 8, 11, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 105, 3, 4, 5, - 6, 132, 128, 9, 8, 11, 133, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, - 6, 8, 105, 9, 129, 11, 133, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 129, 129, 3, - 4, 5, 6, 130, 131, 9, 129, 11, 129, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 129, - 3, 4, 5, 6, 129, 131, 9, 129, 11, 129, + 37, 38, 39, 40, 41, 42, 130, 130, 3, 4, + 5, 6, 130, 129, 9, 130, 11, 134, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 3, 4, + 5, 6, 130, 105, 9, 130, 11, 134, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 130, 130, + 3, 4, 5, 6, 131, 132, 9, 136, 11, 130, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 129, 131, 9, 129, 11, 129, + 3, 4, 5, 6, 130, 132, 9, 132, 11, 130, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 129, 131, 9, 131, 11, 129, + 3, 4, 5, 6, 130, 105, 9, 132, 11, 130, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 129, 129, 9, 130, 11, 129, + 3, 4, 5, 6, 130, 130, 9, 8, 11, 132, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 129, 135, 9, 130, 11, 8, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 8, 105, 9, 130, 11, 8, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 105, 9, 130, 11, 105, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 11, 9, 130, 11, 76, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 105, 9, 130, 11, 105, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 128, 105, 9, 130, 11, 105, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 133, 9, 130, 11, 109, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 105, 9, 130, 11, 105, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 130, 105, 9, 130, 11, 105, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 8, 130, 9, 130, 11, 8, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 128, 131, 9, 130, 11, 128, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 129, 131, 9, 130, 11, 128, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 105, 130, 9, 130, 11, 130, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 3, 4, 5, 6, 128, 130, 9, 130, 11, 128, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 7, 8, 130, 10, 135, 12, 133, 130, 130, 8, - 8, 11, 8, 8, 131, 8, 8, 8, 8, 8, - 105, 105, 29, 30, 105, 32, 33, 105, 133, 36, - 37, 131, 131, 33, 8, 35, 36, 133, 133, 128, - 115, 115, 11, 43, 44, 45, 46, 130, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 113, 114, 115, 116, 30, 30, - 119, 120, 121, 130, 130, 31, 8, 126, 11, 8, - 129, 31, 115, 142, 17, 128, 242, 618, 362, 511, - 463, 36, 334, -1, 63, 624, 29, -1, -1, -1, - -1, -1, -1, 36, -1, 105, -1, 107, -1, -1, - -1, -1, 112, -1, 17, -1, -1, 117, 118, 119, - -1, 121, 122, 123, -1, -1, 126, -1, -1, 129, - 63, 64, 65, 66, 67, -1, 105, -1, 107, -1, - -1, -1, -1, 11, -1, -1, -1, -1, 117, 17, - 119, -1, 121, 122, 123, 17, -1, 126, -1, -1, - 63, -1, 95, 96, 97, -1, 99, -1, 36, -1, - -1, -1, 105, -1, 107, -1, -1, -1, -1, 112, - -1, -1, -1, -1, 117, 118, 119, -1, 121, 122, - 123, 124, 33, 126, 127, 63, 64, 65, 66, 67, - -1, 63, 105, 44, 107, 113, 114, 115, 116, 117, - -1, 119, 120, 121, 122, 123, -1, -1, 121, 122, - 123, -1, -1, -1, -1, -1, -1, 95, 96, 97, - 98, 99, -1, -1, -1, -1, -1, 105, -1, 107, - -1, -1, -1, 105, 112, 107, -1, -1, -1, 117, - 118, 119, -1, 121, 122, 123, 124, -1, 126, 121, - 122, 123, -1, -1, -1, 106, -1, -1, -1, -1, - 132, -1, 113, 114, 115, 116, 117, -1, 119, 120, - 121, 122, 123, 3, 4, 5, 6, -1, 129, 9, - -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, + 130, 3, 4, 5, 6, 130, 130, 9, 131, 11, + 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 3, 4, 5, 6, 8, 105, 9, 131, 11, + 105, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 3, 4, 5, 6, 105, 105, 9, 131, 11, + 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 76, 3, 4, 5, 6, 105, 105, 9, 131, + 11, 105, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 3, 4, 5, 6, 105, 105, 9, 131, + 11, 129, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 3, 4, 5, 6, 105, 134, 9, 131, + 11, 109, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 105, 3, 4, 5, 6, 105, 105, 9, + 131, 11, 131, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, 4, 5, 6, -1, - 8, 9, -1, 11, 64, 13, 14, 15, 16, 17, + 40, 41, 42, 3, 4, 5, 6, 105, 105, 9, + 131, 11, 8, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 3, 4, 5, 6, 8, 131, 9, + 131, 11, 129, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 129, 3, 4, 5, 6, 132, 130, + 9, 131, 11, 129, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 3, 4, 5, 6, 129, 132, + 9, 131, 11, 105, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 3, 4, 5, 6, 131, 131, + 9, 131, 11, 129, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 131, 3, 4, 5, 6, 131, + 136, 9, 131, 11, 134, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, + 38, 39, 40, 41, 42, 3, 4, 5, 6, 8, + 131, 9, 131, 11, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, + 38, 39, 40, 41, 42, 3, 4, 5, 6, 8, + 132, 9, 131, 11, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, - 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 3, 4, 5, 6, -1, + 38, 39, 40, 41, 42, 7, 8, 8, 10, 8, + 12, 8, 8, 131, 105, 8, 105, 11, 105, 105, + 134, 132, 132, 30, 30, 134, 8, 29, 30, 134, + 32, 33, 129, 115, 36, 37, 131, 131, 11, 33, + 115, 35, 36, 8, 8, 31, 31, 116, 244, 43, + 44, 45, 46, 131, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 143, 621, 7, 8, 365, 10, 514, 12, 466, 337, + 17, 36, 627, -1, -1, -1, -1, 11, -1, -1, + 63, 129, -1, 17, 29, 30, -1, 32, 33, -1, + -1, 36, 37, -1, -1, 29, -1, -1, -1, -1, + -1, 105, 36, 107, -1, -1, -1, -1, 112, -1, + -1, -1, -1, 117, 118, 119, 63, 121, 122, 123, + 124, -1, 105, 127, 107, -1, 130, -1, -1, 63, + 64, 65, 66, 67, 117, 33, 119, -1, 121, 122, + 123, 124, -1, 11, 127, -1, 44, -1, -1, 17, + -1, -1, -1, -1, -1, -1, -1, 17, 105, -1, + 107, 95, 96, 97, -1, 99, -1, -1, 36, -1, + -1, 105, -1, 107, 121, 122, 123, 124, 112, -1, + -1, -1, -1, 117, 118, 119, 133, 121, 122, 123, + 124, 125, -1, 127, 128, 63, 64, 65, 66, 67, + -1, -1, -1, 63, -1, -1, -1, -1, 106, -1, + -1, -1, -1, -1, -1, 113, 114, 115, 116, 117, + -1, 119, 120, 121, 122, 123, 124, 95, 96, 97, + 98, 99, 130, -1, -1, -1, -1, 105, -1, 107, + -1, -1, -1, -1, 112, 105, -1, 107, -1, 117, + 118, 119, -1, 121, 122, 123, 124, 125, -1, 127, + -1, 121, 122, 123, 124, 3, 4, 5, 6, -1, -1, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 4, 5, 6, -1, -1, - 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 6, -1, -1, 9, -1, 11, - -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 11, -1, 13, 14, 15, + 38, 39, 40, 41, 42, -1, -1, 113, 114, 115, + 116, -1, -1, 119, 120, 121, -1, 3, 4, 5, + 6, 127, 8, 9, 130, 11, 64, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 7, 8, -1, - 10, -1, 12, -1, -1, -1, 7, -1, -1, 10, - -1, 12, -1, -1, -1, -1, -1, -1, -1, 29, - 30, -1, 32, 33, -1, -1, 36, 37, 29, 30, - -1, 32, 33, -1, -1, 36, 37, 13, 14, 15, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 101, -1, -1, - -1, 10, -1, 12, -1, -1, -1, -1, -1, 113, - 114, 115, 116, -1, -1, 119, 120, 121, -1, -1, - 29, 30, 126, 32, 33, 129, -1, 36, 37, 107, - -1, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, -1, 126, -1, - -1, -1, -1, -1, 107, 133, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, -1, 126, -1, -1, -1, -1, -1, -1, - 133, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 17, 18, 19, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, 8, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 3, 4, 5, + 6, -1, -1, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 4, 5, 6, + -1, -1, 9, -1, 11, -1, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 6, -1, -1, 9, + -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 12, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 29, 30, -1, 32, 33, -1, -1, 36, 37, 107, + 40, 41, 42, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 11, -1, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 107, -1, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, 107, 126, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, - 120, 121, 122, 123, 124, 107, 126, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, - 122, 123, 124, -1, 126 + 118, -1, 120, 121, 122, 123, 124, 125, -1, 127, + -1, -1, -1, -1, -1, 107, 134, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 12, 120, 121, + 122, 123, 124, 125, 10, 127, 12, -1, -1, -1, + -1, -1, 134, -1, 29, 30, -1, 32, 33, -1, + -1, 36, 37, 29, 30, -1, 32, 33, -1, -1, + 36, 37, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 107, -1, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, + 123, 124, 125, 107, 127, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, 127, 107, -1, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, + 123, 124, 125, -1, 127, 113, 114, 115, 116, 117, + -1, 119, 120, 121, 122, 123, 124, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 68, 138, 141, 76, 0, 1, 68, 69, 70, - 77, 107, 126, 135, 139, 140, 142, 143, 144, 145, - 146, 149, 150, 151, 152, 155, 156, 157, 158, 159, - 160, 161, 162, 165, 167, 168, 169, 128, 8, 127, + 0, 68, 139, 142, 76, 0, 1, 68, 69, 70, + 77, 107, 127, 136, 140, 141, 143, 144, 145, 146, + 147, 150, 151, 152, 153, 156, 157, 158, 159, 160, + 161, 162, 163, 166, 168, 169, 170, 129, 8, 128, 71, 78, 80, 93, 100, 103, 109, 90, 91, 92, - 107, 107, 126, 163, 135, 135, 8, 107, 109, 110, + 107, 107, 127, 164, 136, 136, 8, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, - 122, 123, 124, 126, 147, 207, 8, 107, 148, 207, - 8, 72, 74, 87, 88, 68, 127, 139, 140, 134, - 9, 94, 104, 107, 108, 136, 194, 9, 94, 107, - 108, 136, 194, 85, 86, 107, 207, 128, 107, 207, - 107, 132, 197, 117, 107, 153, 154, 89, 113, 115, - 132, 201, 201, 201, 129, 135, 128, 81, 83, 84, - 128, 128, 81, 82, 83, 84, 128, 128, 128, 128, - 181, 182, 101, 113, 114, 115, 116, 119, 120, 121, - 126, 129, 171, 172, 173, 174, 175, 192, 104, 171, - 8, 8, 105, 129, 107, 198, 8, 128, 8, 154, - 128, 113, 115, 202, 132, 199, 33, 105, 132, 195, - 117, 132, 203, 107, 206, 164, 171, 129, 129, 129, - 129, 73, 75, 105, 105, 127, 11, 17, 36, 63, - 64, 65, 66, 67, 95, 96, 97, 98, 99, 105, - 107, 112, 117, 118, 119, 121, 122, 123, 124, 126, - 183, 185, 187, 188, 189, 190, 193, 173, 128, 171, - 6, 8, 11, 132, 176, 101, 14, 17, 18, 19, - 20, 128, 176, 8, 105, 107, 133, 207, 117, 63, - 105, 107, 113, 115, 133, 107, 200, 207, 8, 105, - 33, 105, 107, 196, 8, 107, 117, 204, 8, 130, - 131, 176, 105, 105, 105, 105, 107, 126, 135, 187, - 193, 107, 125, 132, 135, 63, 105, 107, 121, 122, - 123, 132, 186, 190, 132, 186, 8, 132, 33, 35, - 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 112, - 118, 129, 184, 185, 187, 193, 107, 193, 129, 187, - 11, 105, 107, 126, 185, 191, 193, 121, 135, 128, - 135, 129, 128, 129, 184, 129, 135, 128, 132, 33, - 44, 106, 129, 170, 192, 193, 130, 171, 171, 171, - 177, 79, 134, 166, 170, 170, 170, 170, 170, 170, - 166, 130, 132, 87, 107, 133, 207, 105, 33, 105, - 107, 133, 107, 117, 133, 107, 134, 131, 131, 131, - 131, 105, 18, 18, 109, 105, 132, 184, 8, 184, - 8, 184, 184, 184, 184, 184, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 184, 3, 4, 5, 6, 9, - 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 64, 184, 129, 132, 135, 8, 128, 135, 128, - 105, 131, 135, 187, 135, 107, 126, 189, 193, 8, - 8, 105, 184, 105, 184, 205, 184, 205, 128, 105, - 105, 184, 105, 170, 170, 170, 7, 10, 12, 29, - 30, 32, 33, 36, 37, 102, 107, 115, 121, 133, - 179, 180, 181, 76, 105, 128, 105, 105, 105, 105, - 105, 187, 133, 109, 133, 133, 133, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 205, 184, 184, 205, 130, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 186, 188, 105, 105, 184, 105, 130, 107, - 110, 105, 105, 8, 8, 128, 130, 131, 8, 130, - 184, 130, 128, 8, 131, 130, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 129, 128, 128, 182, 29, - 127, 178, 128, 131, 105, 130, 130, 130, 130, 135, - 133, 8, 8, 8, 130, 131, 130, 131, 131, 130, + 122, 123, 124, 125, 127, 148, 208, 8, 107, 149, + 208, 8, 72, 74, 87, 88, 68, 128, 140, 141, + 135, 9, 94, 104, 107, 108, 137, 195, 9, 94, + 107, 108, 137, 195, 85, 86, 107, 208, 129, 107, + 208, 107, 133, 198, 117, 107, 154, 155, 89, 113, + 115, 133, 202, 202, 202, 130, 136, 129, 81, 83, + 84, 129, 129, 81, 82, 83, 84, 129, 129, 129, + 129, 182, 183, 101, 113, 114, 115, 116, 119, 120, + 121, 127, 130, 172, 173, 174, 175, 176, 193, 104, + 172, 8, 8, 105, 130, 107, 199, 8, 129, 8, + 155, 129, 113, 115, 203, 133, 200, 33, 105, 133, + 196, 117, 133, 204, 107, 207, 165, 172, 130, 130, + 130, 130, 73, 75, 105, 105, 128, 11, 17, 36, + 63, 64, 65, 66, 67, 95, 96, 97, 98, 99, + 105, 107, 112, 117, 118, 119, 121, 122, 123, 124, + 125, 127, 184, 186, 188, 189, 190, 191, 194, 174, + 129, 172, 6, 8, 11, 133, 177, 101, 14, 17, + 18, 19, 20, 129, 177, 8, 105, 107, 134, 208, + 117, 63, 105, 107, 113, 115, 134, 107, 201, 208, + 8, 105, 33, 105, 107, 197, 8, 107, 117, 205, + 8, 131, 132, 177, 105, 105, 105, 105, 107, 127, + 136, 188, 194, 107, 126, 133, 136, 63, 105, 107, + 121, 122, 123, 124, 133, 187, 191, 133, 187, 8, + 133, 33, 35, 43, 44, 45, 46, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 112, 118, 130, 185, 186, 188, 194, 107, + 194, 130, 188, 11, 105, 107, 127, 186, 192, 194, + 121, 136, 129, 136, 130, 129, 130, 185, 130, 136, + 129, 133, 33, 44, 106, 130, 171, 193, 194, 131, + 172, 172, 172, 178, 79, 135, 167, 171, 171, 171, + 171, 171, 171, 167, 131, 133, 87, 107, 134, 208, + 105, 33, 105, 107, 134, 107, 117, 134, 107, 135, + 132, 132, 132, 132, 105, 18, 18, 109, 105, 133, + 185, 8, 185, 8, 185, 185, 185, 185, 185, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 131, 130, 130, 8, 130, 131, 8, 8, 128, 8, - 8, 8, 187, 184, 8, 184, 8, 8, 105, 192, - 193, 170, 170, 127, 178, 107, 110, 85, 86, 105, - 197, 105, 184, 184, 184, 184, 105, 184, 8, 133, - 131, 131, 8, 8, 30, 30, 133, 8, 130, 130, - 130, 130, 133, 8, 128, 115, 115, 184, 130, 130, - 8, 8, 8 + 130, 130, 130, 130, 130, 130, 130, 185, 3, 4, + 5, 6, 9, 11, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 64, 185, 130, 133, 136, 8, + 129, 136, 129, 105, 132, 136, 188, 136, 107, 127, + 190, 194, 8, 8, 105, 185, 105, 185, 206, 185, + 206, 129, 105, 105, 185, 105, 171, 171, 171, 7, + 10, 12, 29, 30, 32, 33, 36, 37, 102, 107, + 115, 121, 134, 180, 181, 182, 76, 105, 129, 105, + 105, 105, 105, 105, 188, 134, 109, 134, 134, 134, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 206, 185, 185, 206, 131, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 187, 189, 105, 105, 185, + 105, 131, 107, 110, 105, 105, 8, 8, 129, 131, + 132, 8, 131, 185, 131, 129, 8, 132, 131, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 130, 129, + 129, 183, 29, 128, 179, 129, 132, 105, 131, 131, + 131, 131, 136, 134, 8, 8, 8, 131, 132, 131, + 132, 132, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 132, 131, 131, 8, 131, 132, 8, + 8, 129, 8, 8, 8, 188, 185, 8, 185, 8, + 8, 105, 193, 194, 171, 171, 128, 179, 107, 110, + 85, 86, 105, 198, 105, 185, 185, 185, 185, 105, + 185, 8, 134, 132, 132, 8, 8, 30, 30, 134, + 8, 131, 131, 131, 131, 134, 8, 129, 115, 115, + 185, 131, 131, 8, 8, 8 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 137, 138, 138, 138, 138, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 140, 140, 140, 140, - 141, 141, 142, 143, 144, 144, 144, 144, 144, 145, - 146, 146, 147, 147, 147, 147, 147, 148, 148, 148, - 148, 148, 148, 149, 150, 150, 150, 150, 150, 150, - 150, 151, 151, 152, 153, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 161, 161, 162, 163, 163, 163, - 164, 164, 165, 166, 166, 166, 167, 167, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, - 169, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, - 172, 172, 173, 173, 174, 174, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, - 177, 177, 177, 177, 177, 178, 178, 179, 180, 180, - 181, 181, 181, 181, 181, 182, 182, 182, 182, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, + 0, 138, 139, 139, 139, 139, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, + 142, 142, 143, 144, 145, 145, 145, 145, 145, 146, + 147, 147, 148, 148, 148, 148, 148, 149, 149, 149, + 149, 149, 149, 150, 151, 151, 151, 151, 151, 151, + 151, 152, 152, 153, 154, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 162, 162, 163, 164, 164, 164, + 165, 165, 166, 167, 167, 167, 168, 168, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, + 170, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, + 173, 173, 174, 174, 175, 175, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 177, 177, 178, + 178, 178, 178, 178, 178, 179, 179, 180, 181, 181, + 182, 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, - 186, 186, 187, 187, 187, 187, 188, 188, 188, 188, - 188, 189, 189, 189, 190, 190, 191, 191, 191, 191, - 191, 191, 192, 192, 192, 192, 192, 193, 193, 193, - 193, 193, 194, 194, 195, 195, 195, 196, 196, 196, - 196, 196, 196, 197, 197, 198, 198, 198, 199, 200, - 200, 200, 200, 201, 201, 201, 202, 202, 202, 202, - 202, 203, 203, 204, 204, 204, 204, 205, 205, 205, - 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207 + 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, + 189, 189, 190, 190, 190, 191, 191, 192, 192, 192, + 192, 192, 192, 193, 193, 193, 193, 193, 194, 194, + 194, 194, 194, 194, 195, 195, 196, 196, 196, 197, + 197, 197, 197, 197, 197, 198, 198, 199, 199, 199, + 200, 201, 201, 201, 201, 202, 202, 202, 203, 203, + 203, 203, 203, 204, 204, 205, 205, 205, 205, 206, + 206, 206, 207, 207, 207, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -1599,16 +1595,17 @@ static const yytype_uint8 yyr2[] = 3, 3, 3, 3, 3, 3, 2, 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 3, 6, 1, 4, 4, - 6, 4, 3, 1, 1, 1, 1, 1, 1, 4, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, - 4, 1, 1, 1, 3, 3, 1, 2, 4, 3, + 6, 4, 3, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 2, 4, 1, 1, 1, 3, 3, 1, 2, 4, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 3, 1, 2, 1, + 2, 1, 2, 3, 2, 3, 1, 1, 2, 2, + 3, 1, 1, 2, 2, 3, 1, 1, 1, 1, + 2, 2, 2, 3, 1, 1, 1, 2, 2, 0, + 1, 3, 0, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 3, 1, 2, 1, 2, 1, - 2, 3, 2, 3, 1, 1, 2, 2, 3, 1, - 1, 2, 2, 3, 1, 1, 1, 1, 2, 2, - 2, 3, 1, 1, 1, 2, 2, 0, 1, 3, - 0, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1 }; @@ -2285,1877 +2282,1895 @@ yyreduce: switch (yyn) { case 19: -#line 175 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 177 "slghparse.y" /* yacc.c:1646 */ { slgh->resetConstructors(); } -#line 2276 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2273 "slghparse.cc" /* yacc.c:1646 */ break; case 20: -#line 177 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 179 "slghparse.y" /* yacc.c:1646 */ { slgh->setEndian(1); } -#line 2282 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2279 "slghparse.cc" /* yacc.c:1646 */ break; case 21: -#line 178 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 180 "slghparse.y" /* yacc.c:1646 */ { slgh->setEndian(0); } -#line 2288 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2285 "slghparse.cc" /* yacc.c:1646 */ break; case 22: -#line 180 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 182 "slghparse.y" /* yacc.c:1646 */ { slgh->setAlignment(*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 2294 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2291 "slghparse.cc" /* yacc.c:1646 */ break; case 23: -#line 182 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 184 "slghparse.y" /* yacc.c:1646 */ {} -#line 2300 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2297 "slghparse.cc" /* yacc.c:1646 */ break; case 24: -#line 184 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 186 "slghparse.y" /* yacc.c:1646 */ { (yyval.tokensym) = slgh->defineToken((yyvsp[-3].str),(yyvsp[-1].i),0); } -#line 2306 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2303 "slghparse.cc" /* yacc.c:1646 */ break; case 25: -#line 185 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 187 "slghparse.y" /* yacc.c:1646 */ { (yyval.tokensym) = slgh->defineToken((yyvsp[-6].str),(yyvsp[-4].i),-1); } -#line 2312 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2309 "slghparse.cc" /* yacc.c:1646 */ break; case 26: -#line 186 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 188 "slghparse.y" /* yacc.c:1646 */ { (yyval.tokensym) = slgh->defineToken((yyvsp[-6].str),(yyvsp[-4].i),1); } -#line 2318 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2315 "slghparse.cc" /* yacc.c:1646 */ break; case 27: -#line 187 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 189 "slghparse.y" /* yacc.c:1646 */ { (yyval.tokensym) = (yyvsp[-1].tokensym); slgh->addTokenField((yyvsp[-1].tokensym),(yyvsp[0].fieldqual)); } -#line 2324 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2321 "slghparse.cc" /* yacc.c:1646 */ break; case 28: -#line 188 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 190 "slghparse.y" /* yacc.c:1646 */ { string errmsg=(yyvsp[0].anysym)->getName()+": redefined as a token"; yyerror(errmsg.c_str()); YYERROR; } -#line 2330 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2327 "slghparse.cc" /* yacc.c:1646 */ break; case 29: -#line 190 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 192 "slghparse.y" /* yacc.c:1646 */ {} -#line 2336 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2333 "slghparse.cc" /* yacc.c:1646 */ break; case 30: -#line 192 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 194 "slghparse.y" /* yacc.c:1646 */ { (yyval.varsym) = (yyvsp[0].varsym); } -#line 2342 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2339 "slghparse.cc" /* yacc.c:1646 */ break; case 31: -#line 193 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 195 "slghparse.y" /* yacc.c:1646 */ { (yyval.varsym) = (yyvsp[-1].varsym); if (!slgh->addContextField( (yyvsp[-1].varsym), (yyvsp[0].fieldqual) )) { yyerror("All context definitions must come before constructors"); YYERROR; } } -#line 2349 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2346 "slghparse.cc" /* yacc.c:1646 */ break; case 32: -#line 196 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 198 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = new FieldQuality((yyvsp[-6].str),(yyvsp[-3].i),(yyvsp[-1].i)); } -#line 2355 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2352 "slghparse.cc" /* yacc.c:1646 */ break; case 33: -#line 197 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 199 "slghparse.y" /* yacc.c:1646 */ { delete (yyvsp[-3].i); delete (yyvsp[-1].i); string errmsg = (yyvsp[-6].anysym)->getName()+": redefined as field"; yyerror(errmsg.c_str()); YYERROR; } -#line 2361 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2358 "slghparse.cc" /* yacc.c:1646 */ break; case 34: -#line 198 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 200 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->signext = true; } -#line 2367 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2364 "slghparse.cc" /* yacc.c:1646 */ break; case 35: -#line 199 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 201 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->hex = true; } -#line 2373 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2370 "slghparse.cc" /* yacc.c:1646 */ break; case 36: -#line 200 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 202 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->hex = false; } -#line 2379 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2376 "slghparse.cc" /* yacc.c:1646 */ break; case 37: -#line 202 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 204 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = new FieldQuality((yyvsp[-6].str),(yyvsp[-3].i),(yyvsp[-1].i)); } -#line 2385 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2382 "slghparse.cc" /* yacc.c:1646 */ break; case 38: -#line 203 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 205 "slghparse.y" /* yacc.c:1646 */ { delete (yyvsp[-3].i); delete (yyvsp[-1].i); string errmsg = (yyvsp[-6].anysym)->getName()+": redefined as field"; yyerror(errmsg.c_str()); YYERROR; } -#line 2391 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2388 "slghparse.cc" /* yacc.c:1646 */ break; case 39: -#line 204 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 206 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->signext = true; } -#line 2397 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2394 "slghparse.cc" /* yacc.c:1646 */ break; case 40: -#line 205 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 207 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->flow = false; } -#line 2403 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2400 "slghparse.cc" /* yacc.c:1646 */ break; case 41: -#line 206 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 208 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->hex = true; } -#line 2409 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2406 "slghparse.cc" /* yacc.c:1646 */ break; case 42: -#line 207 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 209 "slghparse.y" /* yacc.c:1646 */ { (yyval.fieldqual) = (yyvsp[-1].fieldqual); (yyval.fieldqual)->hex = false; } -#line 2415 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2412 "slghparse.cc" /* yacc.c:1646 */ break; case 43: -#line 209 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 211 "slghparse.y" /* yacc.c:1646 */ { slgh->newSpace((yyvsp[-1].spacequal)); } -#line 2421 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2418 "slghparse.cc" /* yacc.c:1646 */ break; case 44: -#line 211 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 213 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = new SpaceQuality(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 2427 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2424 "slghparse.cc" /* yacc.c:1646 */ break; case 45: -#line 212 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 214 "slghparse.y" /* yacc.c:1646 */ { string errmsg = (yyvsp[0].anysym)->getName()+": redefined as space"; yyerror(errmsg.c_str()); YYERROR; } -#line 2433 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2430 "slghparse.cc" /* yacc.c:1646 */ break; case 46: -#line 213 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 215 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = (yyvsp[-3].spacequal); (yyval.spacequal)->type = SpaceQuality::ramtype; } -#line 2439 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2436 "slghparse.cc" /* yacc.c:1646 */ break; case 47: -#line 214 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 216 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = (yyvsp[-3].spacequal); (yyval.spacequal)->type = SpaceQuality::registertype; } -#line 2445 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2442 "slghparse.cc" /* yacc.c:1646 */ break; case 48: -#line 215 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 217 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = (yyvsp[-3].spacequal); (yyval.spacequal)->size = *(yyvsp[0].i); delete (yyvsp[0].i); } -#line 2451 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2448 "slghparse.cc" /* yacc.c:1646 */ break; case 49: -#line 216 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 218 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = (yyvsp[-3].spacequal); (yyval.spacequal)->wordsize = *(yyvsp[0].i); delete (yyvsp[0].i); } -#line 2457 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2454 "slghparse.cc" /* yacc.c:1646 */ break; case 50: -#line 217 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 219 "slghparse.y" /* yacc.c:1646 */ { (yyval.spacequal) = (yyvsp[-1].spacequal); (yyval.spacequal)->isdefault = true; } -#line 2463 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2460 "slghparse.cc" /* yacc.c:1646 */ break; case 51: -#line 219 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 221 "slghparse.y" /* yacc.c:1646 */ { slgh->defineVarnodes((yyvsp[-8].spacesym),(yyvsp[-5].i),(yyvsp[-2].i),(yyvsp[-1].strlist)); } -#line 2470 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2467 "slghparse.cc" /* yacc.c:1646 */ break; case 52: -#line 221 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 223 "slghparse.y" /* yacc.c:1646 */ { yyerror("Parsed integer is too big (overflow)"); YYERROR; } -#line 2476 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2473 "slghparse.cc" /* yacc.c:1646 */ break; case 56: -#line 228 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 230 "slghparse.y" /* yacc.c:1646 */ { slgh->defineBitrange((yyvsp[-7].str),(yyvsp[-5].varsym),(uint4)*(yyvsp[-3].i),(uint4)*(yyvsp[-1].i)); delete (yyvsp[-3].i); delete (yyvsp[-1].i); } -#line 2483 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2480 "slghparse.cc" /* yacc.c:1646 */ break; case 57: -#line 231 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 233 "slghparse.y" /* yacc.c:1646 */ { slgh->addUserOp((yyvsp[-1].strlist)); } -#line 2489 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2486 "slghparse.cc" /* yacc.c:1646 */ break; case 58: -#line 233 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 235 "slghparse.y" /* yacc.c:1646 */ { slgh->attachValues((yyvsp[-2].symlist),(yyvsp[-1].biglist)); } -#line 2495 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2492 "slghparse.cc" /* yacc.c:1646 */ break; case 59: -#line 235 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 237 "slghparse.y" /* yacc.c:1646 */ { slgh->attachNames((yyvsp[-2].symlist),(yyvsp[-1].strlist)); } -#line 2501 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2498 "slghparse.cc" /* yacc.c:1646 */ break; case 60: -#line 237 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 239 "slghparse.y" /* yacc.c:1646 */ { slgh->attachVarnodes((yyvsp[-2].symlist),(yyvsp[-1].symlist)); } -#line 2507 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2504 "slghparse.cc" /* yacc.c:1646 */ break; case 61: -#line 239 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 241 "slghparse.y" /* yacc.c:1646 */ { slgh->buildMacro((yyvsp[-3].macrosym),(yyvsp[-1].sem)); } -#line 2513 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2510 "slghparse.cc" /* yacc.c:1646 */ break; case 62: -#line 242 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 244 "slghparse.y" /* yacc.c:1646 */ { slgh->pushWith((yyvsp[-4].subtablesym),(yyvsp[-2].pateq),(yyvsp[-1].contop)); } -#line 2519 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2516 "slghparse.cc" /* yacc.c:1646 */ break; case 66: -#line 248 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 250 "slghparse.y" /* yacc.c:1646 */ { slgh->popWith(); } -#line 2525 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2522 "slghparse.cc" /* yacc.c:1646 */ break; case 67: -#line 250 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 252 "slghparse.y" /* yacc.c:1646 */ { (yyval.subtablesym) = (SubtableSymbol *)0; } -#line 2531 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2528 "slghparse.cc" /* yacc.c:1646 */ break; case 68: -#line 251 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 253 "slghparse.y" /* yacc.c:1646 */ { (yyval.subtablesym) = (yyvsp[0].subtablesym); } -#line 2537 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2534 "slghparse.cc" /* yacc.c:1646 */ break; case 69: -#line 252 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 254 "slghparse.y" /* yacc.c:1646 */ { (yyval.subtablesym) = slgh->newTable((yyvsp[0].str)); } -#line 2543 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2540 "slghparse.cc" /* yacc.c:1646 */ break; case 70: -#line 255 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 257 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = (PatternEquation *)0; } -#line 2549 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2546 "slghparse.cc" /* yacc.c:1646 */ break; case 71: -#line 256 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 258 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = (yyvsp[0].pateq); } -#line 2555 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2552 "slghparse.cc" /* yacc.c:1646 */ break; case 72: -#line 259 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 261 "slghparse.y" /* yacc.c:1646 */ { (yyval.macrosym) = slgh->createMacro((yyvsp[-3].str),(yyvsp[-1].strlist)); } -#line 2561 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2558 "slghparse.cc" /* yacc.c:1646 */ break; case 73: -#line 261 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 263 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = slgh->standaloneSection((yyvsp[-1].sem)); } -#line 2567 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2564 "slghparse.cc" /* yacc.c:1646 */ break; case 74: -#line 262 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 264 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = slgh->finalNamedSection((yyvsp[-2].sectionstart),(yyvsp[-1].sem)); } -#line 2573 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2570 "slghparse.cc" /* yacc.c:1646 */ break; case 75: -#line 263 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 265 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = (SectionVector *)0; } -#line 2579 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2576 "slghparse.cc" /* yacc.c:1646 */ break; case 76: -#line 265 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 267 "slghparse.y" /* yacc.c:1646 */ { slgh->buildConstructor((yyvsp[-4].construct),(yyvsp[-2].pateq),(yyvsp[-1].contop),(yyvsp[0].sectionstart)); } -#line 2585 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2582 "slghparse.cc" /* yacc.c:1646 */ break; case 77: -#line 266 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 268 "slghparse.y" /* yacc.c:1646 */ { slgh->buildConstructor((yyvsp[-4].construct),(yyvsp[-2].pateq),(yyvsp[-1].contop),(yyvsp[0].sectionstart)); } -#line 2591 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2588 "slghparse.cc" /* yacc.c:1646 */ break; case 78: -#line 268 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 270 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); (yyval.construct)->addSyntax(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 2597 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2594 "slghparse.cc" /* yacc.c:1646 */ break; case 79: -#line 269 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 271 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); (yyval.construct)->addSyntax(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 2603 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2600 "slghparse.cc" /* yacc.c:1646 */ break; case 80: -#line 270 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 272 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); if (slgh->isInRoot((yyvsp[-1].construct))) { (yyval.construct)->addSyntax(*(yyvsp[0].str)); delete (yyvsp[0].str); } else slgh->newOperand((yyvsp[-1].construct),(yyvsp[0].str)); } -#line 2609 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2606 "slghparse.cc" /* yacc.c:1646 */ break; case 81: -#line 271 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 273 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); if (!slgh->isInRoot((yyvsp[-1].construct))) { yyerror("Unexpected '^' at start of print pieces"); YYERROR; } } -#line 2615 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2612 "slghparse.cc" /* yacc.c:1646 */ break; case 82: -#line 272 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 274 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); } -#line 2621 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2618 "slghparse.cc" /* yacc.c:1646 */ break; case 83: -#line 273 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 275 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); (yyval.construct)->addSyntax(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 2627 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2624 "slghparse.cc" /* yacc.c:1646 */ break; case 84: -#line 274 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 276 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); (yyval.construct)->addSyntax(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 2633 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2630 "slghparse.cc" /* yacc.c:1646 */ break; case 85: -#line 275 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 277 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); (yyval.construct)->addSyntax(string(" ")); } -#line 2639 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2636 "slghparse.cc" /* yacc.c:1646 */ break; case 86: -#line 276 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 278 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); slgh->newOperand((yyvsp[-1].construct),(yyvsp[0].str)); } -#line 2645 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2642 "slghparse.cc" /* yacc.c:1646 */ break; case 87: -#line 278 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 280 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = slgh->createConstructor((yyvsp[-1].subtablesym)); } -#line 2651 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2648 "slghparse.cc" /* yacc.c:1646 */ break; case 88: -#line 279 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 281 "slghparse.y" /* yacc.c:1646 */ { SubtableSymbol *sym=slgh->newTable((yyvsp[-1].str)); (yyval.construct) = slgh->createConstructor(sym); } -#line 2657 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2654 "slghparse.cc" /* yacc.c:1646 */ break; case 89: -#line 280 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 282 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = slgh->createConstructor((SubtableSymbol *)0); } -#line 2663 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2660 "slghparse.cc" /* yacc.c:1646 */ break; case 90: -#line 281 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 283 "slghparse.y" /* yacc.c:1646 */ { (yyval.construct) = (yyvsp[-1].construct); } -#line 2669 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2666 "slghparse.cc" /* yacc.c:1646 */ break; case 91: -#line 283 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 285 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new ConstantValue(*(yyvsp[0].big)); delete (yyvsp[0].big); } -#line 2675 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2672 "slghparse.cc" /* yacc.c:1646 */ break; case 92: -#line 285 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 287 "slghparse.y" /* yacc.c:1646 */ { if ((actionon==1)&&((yyvsp[0].famsym)->getType() != SleighSymbol::context_symbol)) { string errmsg="Global symbol "+(yyvsp[0].famsym)->getName(); errmsg += " is not allowed in action expression"; yyerror(errmsg.c_str()); } (yyval.patexp) = (yyvsp[0].famsym)->getPatternValue(); } -#line 2682 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2679 "slghparse.cc" /* yacc.c:1646 */ break; case 93: -#line 288 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 290 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = (yyvsp[0].specsym)->getPatternExpression(); } -#line 2688 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2685 "slghparse.cc" /* yacc.c:1646 */ break; case 94: -#line 289 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 291 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = (yyvsp[-1].patexp); } -#line 2694 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2691 "slghparse.cc" /* yacc.c:1646 */ break; case 95: -#line 290 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 292 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new PlusExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2700 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2697 "slghparse.cc" /* yacc.c:1646 */ break; case 96: -#line 291 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 293 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new SubExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2706 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2703 "slghparse.cc" /* yacc.c:1646 */ break; case 97: -#line 292 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 294 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new MultExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2712 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2709 "slghparse.cc" /* yacc.c:1646 */ break; case 98: -#line 293 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 295 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new LeftShiftExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2718 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2715 "slghparse.cc" /* yacc.c:1646 */ break; case 99: -#line 294 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 296 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new RightShiftExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2724 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2721 "slghparse.cc" /* yacc.c:1646 */ break; case 100: -#line 295 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 297 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new AndExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2730 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2727 "slghparse.cc" /* yacc.c:1646 */ break; case 101: -#line 296 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 298 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new OrExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2736 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2733 "slghparse.cc" /* yacc.c:1646 */ break; case 102: -#line 297 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 299 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new XorExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2742 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2739 "slghparse.cc" /* yacc.c:1646 */ break; case 103: -#line 298 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 300 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new DivExpression((yyvsp[-2].patexp),(yyvsp[0].patexp)); } -#line 2748 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2745 "slghparse.cc" /* yacc.c:1646 */ break; case 104: -#line 299 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 301 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new MinusExpression((yyvsp[0].patexp)); } -#line 2754 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2751 "slghparse.cc" /* yacc.c:1646 */ break; case 105: -#line 300 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 302 "slghparse.y" /* yacc.c:1646 */ { (yyval.patexp) = new NotExpression((yyvsp[0].patexp)); } -#line 2760 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2757 "slghparse.cc" /* yacc.c:1646 */ break; case 107: -#line 303 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 305 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EquationAnd((yyvsp[-2].pateq),(yyvsp[0].pateq)); } -#line 2766 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2763 "slghparse.cc" /* yacc.c:1646 */ break; case 108: -#line 304 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 306 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EquationOr((yyvsp[-2].pateq),(yyvsp[0].pateq)); } -#line 2772 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2769 "slghparse.cc" /* yacc.c:1646 */ break; case 109: -#line 305 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 307 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EquationCat((yyvsp[-2].pateq),(yyvsp[0].pateq)); } -#line 2778 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2775 "slghparse.cc" /* yacc.c:1646 */ break; case 110: -#line 307 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 309 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EquationLeftEllipsis((yyvsp[0].pateq)); } -#line 2784 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2781 "slghparse.cc" /* yacc.c:1646 */ break; case 112: -#line 310 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 312 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EquationRightEllipsis((yyvsp[-1].pateq)); } -#line 2790 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2787 "slghparse.cc" /* yacc.c:1646 */ break; case 115: -#line 314 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 316 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = (yyvsp[-1].pateq); } -#line 2796 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2793 "slghparse.cc" /* yacc.c:1646 */ break; case 116: -#line 316 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 318 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new EqualEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2802 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2799 "slghparse.cc" /* yacc.c:1646 */ break; case 117: -#line 317 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 319 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new NotEqualEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2808 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2805 "slghparse.cc" /* yacc.c:1646 */ break; case 118: -#line 318 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 320 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new LessEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2814 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2811 "slghparse.cc" /* yacc.c:1646 */ break; case 119: -#line 319 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 321 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new LessEqualEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2820 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2817 "slghparse.cc" /* yacc.c:1646 */ break; case 120: -#line 320 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 322 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new GreaterEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2826 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2823 "slghparse.cc" /* yacc.c:1646 */ break; case 121: -#line 321 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 323 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new GreaterEqualEquation((yyvsp[-2].famsym)->getPatternValue(),(yyvsp[0].patexp)); } -#line 2832 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2829 "slghparse.cc" /* yacc.c:1646 */ break; case 122: -#line 322 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 324 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = slgh->constrainOperand((yyvsp[-2].operandsym),(yyvsp[0].patexp)); if ((yyval.pateq) == (PatternEquation *)0) { string errmsg="Constraining currently undefined operand "+(yyvsp[-2].operandsym)->getName(); yyerror(errmsg.c_str()); } } -#line 2840 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2837 "slghparse.cc" /* yacc.c:1646 */ break; case 123: -#line 325 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 327 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new OperandEquation((yyvsp[0].operandsym)->getIndex()); slgh->selfDefine((yyvsp[0].operandsym)); } -#line 2846 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2843 "slghparse.cc" /* yacc.c:1646 */ break; case 124: -#line 326 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 328 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = new UnconstrainedEquation((yyvsp[0].specsym)->getPatternExpression()); } -#line 2852 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2849 "slghparse.cc" /* yacc.c:1646 */ break; case 125: -#line 327 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 329 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = slgh->defineInvisibleOperand((yyvsp[0].famsym)); } -#line 2858 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2855 "slghparse.cc" /* yacc.c:1646 */ break; case 126: -#line 328 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 330 "slghparse.y" /* yacc.c:1646 */ { (yyval.pateq) = slgh->defineInvisibleOperand((yyvsp[0].subtablesym)); } -#line 2864 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2861 "slghparse.cc" /* yacc.c:1646 */ break; case 127: -#line 330 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 332 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = (vector *)0; } -#line 2870 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2867 "slghparse.cc" /* yacc.c:1646 */ break; case 128: -#line 331 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 333 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = (yyvsp[-1].contop); } -#line 2876 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2873 "slghparse.cc" /* yacc.c:1646 */ break; case 129: -#line 333 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 335 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = new vector; } -#line 2882 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2879 "slghparse.cc" /* yacc.c:1646 */ break; case 130: -#line 334 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.contop) = (yyvsp[-4].contop); if (!slgh->contextMod((yyvsp[-4].contop),(yyvsp[-3].contextsym),(yyvsp[-1].patexp))) { string errmsg="Cannot use 'inst_next' to set context variable: "+(yyvsp[-3].contextsym)->getName(); yyerror(errmsg.c_str()); YYERROR; } } -#line 2888 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 336 "slghparse.y" /* yacc.c:1646 */ + { (yyval.contop) = (yyvsp[-4].contop); if (!slgh->contextMod((yyvsp[-4].contop),(yyvsp[-3].contextsym),(yyvsp[-1].patexp))) { string errmsg="Cannot use 'inst_next' or 'inst_next2' to set context variable: "+(yyvsp[-3].contextsym)->getName(); yyerror(errmsg.c_str()); YYERROR; } } +#line 2885 "slghparse.cc" /* yacc.c:1646 */ break; case 131: -#line 335 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 337 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = (yyvsp[-7].contop); slgh->contextSet((yyvsp[-7].contop),(yyvsp[-4].famsym),(yyvsp[-2].contextsym)); } -#line 2894 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2891 "slghparse.cc" /* yacc.c:1646 */ break; case 132: -#line 336 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 338 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = (yyvsp[-7].contop); slgh->contextSet((yyvsp[-7].contop),(yyvsp[-4].specsym),(yyvsp[-2].contextsym)); } -#line 2900 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2897 "slghparse.cc" /* yacc.c:1646 */ break; case 133: -#line 337 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 339 "slghparse.y" /* yacc.c:1646 */ { (yyval.contop) = (yyvsp[-4].contop); slgh->defineOperand((yyvsp[-3].operandsym),(yyvsp[-1].patexp)); } -#line 2906 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2903 "slghparse.cc" /* yacc.c:1646 */ break; case 134: -#line 338 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 340 "slghparse.y" /* yacc.c:1646 */ { string errmsg="Expecting context symbol, not "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2912 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2909 "slghparse.cc" /* yacc.c:1646 */ break; case 135: -#line 340 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 342 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionsym) = slgh->newSectionSymbol( *(yyvsp[-1].str) ); delete (yyvsp[-1].str); } -#line 2918 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2915 "slghparse.cc" /* yacc.c:1646 */ break; case 136: -#line 341 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 343 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionsym) = (yyvsp[-1].sectionsym); } -#line 2924 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2921 "slghparse.cc" /* yacc.c:1646 */ break; case 137: -#line 343 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 345 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = slgh->firstNamedSection((yyvsp[-1].sem),(yyvsp[0].sectionsym)); } -#line 2930 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2927 "slghparse.cc" /* yacc.c:1646 */ break; case 138: -#line 345 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 347 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = (yyvsp[0].sectionstart); } -#line 2936 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2933 "slghparse.cc" /* yacc.c:1646 */ break; case 139: -#line 346 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 348 "slghparse.y" /* yacc.c:1646 */ { (yyval.sectionstart) = slgh->nextNamedSection((yyvsp[-2].sectionstart),(yyvsp[-1].sem),(yyvsp[0].sectionsym)); } -#line 2942 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2939 "slghparse.cc" /* yacc.c:1646 */ break; case 140: -#line 348 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 350 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[0].sem); if ((yyval.sem)->getOpvec().empty() && ((yyval.sem)->getResult() == (HandleTpl *)0)) slgh->recordNop(); } -#line 2948 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2945 "slghparse.cc" /* yacc.c:1646 */ break; case 141: -#line 349 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 351 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = slgh->setResultVarnode((yyvsp[-3].sem),(yyvsp[-1].varnode)); } -#line 2954 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2951 "slghparse.cc" /* yacc.c:1646 */ break; case 142: -#line 350 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 352 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = slgh->setResultStarVarnode((yyvsp[-4].sem),(yyvsp[-2].starqual),(yyvsp[-1].varnode)); } -#line 2960 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2957 "slghparse.cc" /* yacc.c:1646 */ break; case 143: -#line 351 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 353 "slghparse.y" /* yacc.c:1646 */ { string errmsg="Unknown export varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2966 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2963 "slghparse.cc" /* yacc.c:1646 */ break; case 144: -#line 352 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 354 "slghparse.y" /* yacc.c:1646 */ { string errmsg="Unknown pointer varnode: "+*(yyvsp[0].str); delete (yyvsp[-1].starqual); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 2972 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2969 "slghparse.cc" /* yacc.c:1646 */ break; case 145: -#line 354 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 356 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = new ConstructTpl(); } -#line 2978 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2975 "slghparse.cc" /* yacc.c:1646 */ break; case 146: -#line 355 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 357 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-1].sem); if (!(yyval.sem)->addOpList(*(yyvsp[0].stmt))) { delete (yyvsp[0].stmt); yyerror("Multiple delayslot declarations"); YYERROR; } delete (yyvsp[0].stmt); } -#line 2984 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2981 "slghparse.cc" /* yacc.c:1646 */ break; case 147: -#line 356 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 358 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-3].sem); slgh->pcode.newLocalDefinition((yyvsp[-1].str)); } -#line 2990 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2987 "slghparse.cc" /* yacc.c:1646 */ break; case 148: -#line 357 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 359 "slghparse.y" /* yacc.c:1646 */ { (yyval.sem) = (yyvsp[-5].sem); slgh->pcode.newLocalDefinition((yyvsp[-3].str),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 2996 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2993 "slghparse.cc" /* yacc.c:1646 */ break; case 149: -#line 359 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 361 "slghparse.y" /* yacc.c:1646 */ { (yyvsp[-1].tree)->setOutput((yyvsp[-3].varnode)); (yyval.stmt) = ExprTree::toVector((yyvsp[-1].tree)); } -#line 3002 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 2999 "slghparse.cc" /* yacc.c:1646 */ break; case 150: -#line 360 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 362 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.newOutput(true,(yyvsp[-1].tree),(yyvsp[-3].str)); } -#line 3008 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3005 "slghparse.cc" /* yacc.c:1646 */ break; case 151: -#line 361 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 363 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.newOutput(false,(yyvsp[-1].tree),(yyvsp[-3].str)); } -#line 3014 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3011 "slghparse.cc" /* yacc.c:1646 */ break; case 152: -#line 362 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 364 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.newOutput(true,(yyvsp[-1].tree),(yyvsp[-5].str),*(yyvsp[-3].i)); delete (yyvsp[-3].i); } -#line 3020 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3017 "slghparse.cc" /* yacc.c:1646 */ break; case 153: -#line 363 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 365 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.newOutput(true,(yyvsp[-1].tree),(yyvsp[-5].str),*(yyvsp[-3].i)); delete (yyvsp[-3].i); } -#line 3026 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3023 "slghparse.cc" /* yacc.c:1646 */ break; case 154: -#line 364 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 366 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = (vector *)0; string errmsg = "Redefinition of symbol: "+(yyvsp[-1].specsym)->getName(); yyerror(errmsg.c_str()); YYERROR; } -#line 3032 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3029 "slghparse.cc" /* yacc.c:1646 */ break; case 155: -#line 365 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 367 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createStore((yyvsp[-4].starqual),(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 3038 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3035 "slghparse.cc" /* yacc.c:1646 */ break; case 156: -#line 366 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 368 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createUserOpNoOut((yyvsp[-4].useropsym),(yyvsp[-2].param)); } -#line 3044 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3041 "slghparse.cc" /* yacc.c:1646 */ break; case 157: -#line 367 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 369 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.assignBitRange((yyvsp[-8].varnode),(uint4)*(yyvsp[-6].i),(uint4)*(yyvsp[-4].i),(yyvsp[-1].tree)); delete (yyvsp[-6].i), delete (yyvsp[-4].i); } -#line 3050 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3047 "slghparse.cc" /* yacc.c:1646 */ break; case 158: -#line 368 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 370 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt)=slgh->pcode.assignBitRange((yyvsp[-3].bitsym)->getParentSymbol()->getVarnode(),(yyvsp[-3].bitsym)->getBitOffset(),(yyvsp[-3].bitsym)->numBits(),(yyvsp[-1].tree)); } -#line 3056 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3053 "slghparse.cc" /* yacc.c:1646 */ break; case 159: -#line 369 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 371 "slghparse.y" /* yacc.c:1646 */ { delete (yyvsp[-3].varnode); delete (yyvsp[-1].i); yyerror("Illegal truncation on left-hand side of assignment"); YYERROR; } -#line 3062 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3059 "slghparse.cc" /* yacc.c:1646 */ break; case 160: -#line 370 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 372 "slghparse.y" /* yacc.c:1646 */ { delete (yyvsp[-3].varnode); delete (yyvsp[-1].i); yyerror("Illegal subpiece on left-hand side of assignment"); YYERROR; } -#line 3068 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3065 "slghparse.cc" /* yacc.c:1646 */ break; case 161: -#line 371 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 373 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpConst(BUILD,(yyvsp[-1].operandsym)->getIndex()); } -#line 3074 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3071 "slghparse.cc" /* yacc.c:1646 */ break; case 162: -#line 372 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 374 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->createCrossBuild((yyvsp[-3].varnode),(yyvsp[-1].sectionsym)); } -#line 3080 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3077 "slghparse.cc" /* yacc.c:1646 */ break; case 163: -#line 373 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 375 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->createCrossBuild((yyvsp[-3].varnode),slgh->newSectionSymbol(*(yyvsp[-1].str))); delete (yyvsp[-1].str); } -#line 3086 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3083 "slghparse.cc" /* yacc.c:1646 */ break; case 164: -#line 374 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 376 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpConst(DELAY_SLOT,*(yyvsp[-2].i)); delete (yyvsp[-2].i); } -#line 3092 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3089 "slghparse.cc" /* yacc.c:1646 */ break; case 165: -#line 375 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 377 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_BRANCH,new ExprTree((yyvsp[-1].varnode))); } -#line 3098 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3095 "slghparse.cc" /* yacc.c:1646 */ break; case 166: -#line 376 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 378 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_CBRANCH,new ExprTree((yyvsp[-1].varnode)),(yyvsp[-3].tree)); } -#line 3104 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3101 "slghparse.cc" /* yacc.c:1646 */ break; case 167: -#line 377 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 379 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_BRANCHIND,(yyvsp[-2].tree)); } -#line 3110 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3107 "slghparse.cc" /* yacc.c:1646 */ break; case 168: -#line 378 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 380 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_CALL,new ExprTree((yyvsp[-1].varnode))); } -#line 3116 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3113 "slghparse.cc" /* yacc.c:1646 */ break; case 169: -#line 379 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 381 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_CALLIND,(yyvsp[-2].tree)); } -#line 3122 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3119 "slghparse.cc" /* yacc.c:1646 */ break; case 170: -#line 380 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 382 "slghparse.y" /* yacc.c:1646 */ { yyerror("Must specify an indirect parameter for return"); YYERROR; } -#line 3128 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3125 "slghparse.cc" /* yacc.c:1646 */ break; case 171: -#line 381 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 383 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.createOpNoOut(CPUI_RETURN,(yyvsp[-2].tree)); } -#line 3134 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3131 "slghparse.cc" /* yacc.c:1646 */ break; case 172: -#line 382 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 384 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->createMacroUse((yyvsp[-4].macrosym),(yyvsp[-2].param)); } -#line 3140 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3137 "slghparse.cc" /* yacc.c:1646 */ break; case 173: -#line 383 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 385 "slghparse.y" /* yacc.c:1646 */ { (yyval.stmt) = slgh->pcode.placeLabel( (yyvsp[0].labelsym) ); } -#line 3146 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3143 "slghparse.cc" /* yacc.c:1646 */ break; case 174: -#line 385 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 387 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = new ExprTree((yyvsp[0].varnode)); } -#line 3152 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3149 "slghparse.cc" /* yacc.c:1646 */ break; case 175: -#line 386 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 388 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createLoad((yyvsp[-1].starqual),(yyvsp[0].tree)); } -#line 3158 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3155 "slghparse.cc" /* yacc.c:1646 */ break; case 176: -#line 387 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 389 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = (yyvsp[-1].tree); } -#line 3164 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3161 "slghparse.cc" /* yacc.c:1646 */ break; case 177: -#line 388 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 390 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_ADD,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3170 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3167 "slghparse.cc" /* yacc.c:1646 */ break; case 178: -#line 389 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 391 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SUB,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3176 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3173 "slghparse.cc" /* yacc.c:1646 */ break; case 179: -#line 390 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 392 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_EQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3182 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3179 "slghparse.cc" /* yacc.c:1646 */ break; case 180: -#line 391 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 393 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_NOTEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3188 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3185 "slghparse.cc" /* yacc.c:1646 */ break; case 181: -#line 392 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 394 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_LESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3194 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3191 "slghparse.cc" /* yacc.c:1646 */ break; case 182: -#line 393 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 395 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_LESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3200 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3197 "slghparse.cc" /* yacc.c:1646 */ break; case 183: -#line 394 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 396 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_LESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3206 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3203 "slghparse.cc" /* yacc.c:1646 */ break; case 184: -#line 395 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 397 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_LESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3212 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3209 "slghparse.cc" /* yacc.c:1646 */ break; case 185: -#line 396 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 398 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SLESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3218 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3215 "slghparse.cc" /* yacc.c:1646 */ break; case 186: -#line 397 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 399 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SLESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3224 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3221 "slghparse.cc" /* yacc.c:1646 */ break; case 187: -#line 398 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 400 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SLESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3230 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3227 "slghparse.cc" /* yacc.c:1646 */ break; case 188: -#line 399 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 401 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SLESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3236 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3233 "slghparse.cc" /* yacc.c:1646 */ break; case 189: -#line 400 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 402 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_2COMP,(yyvsp[0].tree)); } -#line 3242 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3239 "slghparse.cc" /* yacc.c:1646 */ break; case 190: -#line 401 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 403 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_NEGATE,(yyvsp[0].tree)); } -#line 3248 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3245 "slghparse.cc" /* yacc.c:1646 */ break; case 191: -#line 402 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 404 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_XOR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3254 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3251 "slghparse.cc" /* yacc.c:1646 */ break; case 192: -#line 403 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 405 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_AND,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3260 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3257 "slghparse.cc" /* yacc.c:1646 */ break; case 193: -#line 404 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 406 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_OR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3266 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3263 "slghparse.cc" /* yacc.c:1646 */ break; case 194: -#line 405 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 407 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_LEFT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3272 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3269 "slghparse.cc" /* yacc.c:1646 */ break; case 195: -#line 406 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 408 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_RIGHT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3278 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3275 "slghparse.cc" /* yacc.c:1646 */ break; case 196: -#line 407 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 409 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SRIGHT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3284 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3281 "slghparse.cc" /* yacc.c:1646 */ break; case 197: -#line 408 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 410 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_MULT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3290 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3287 "slghparse.cc" /* yacc.c:1646 */ break; case 198: -#line 409 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 411 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_DIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3296 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3293 "slghparse.cc" /* yacc.c:1646 */ break; case 199: -#line 410 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 412 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SDIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3302 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3299 "slghparse.cc" /* yacc.c:1646 */ break; case 200: -#line 411 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 413 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_REM,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3308 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3305 "slghparse.cc" /* yacc.c:1646 */ break; case 201: -#line 412 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 414 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SREM,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3314 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3311 "slghparse.cc" /* yacc.c:1646 */ break; case 202: -#line 413 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 415 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_BOOL_NEGATE,(yyvsp[0].tree)); } -#line 3320 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3317 "slghparse.cc" /* yacc.c:1646 */ break; case 203: -#line 414 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 416 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_BOOL_XOR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3326 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3323 "slghparse.cc" /* yacc.c:1646 */ break; case 204: -#line 415 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 417 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_BOOL_AND,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3332 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3329 "slghparse.cc" /* yacc.c:1646 */ break; case 205: -#line 416 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 418 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_BOOL_OR,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3338 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3335 "slghparse.cc" /* yacc.c:1646 */ break; case 206: -#line 417 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 419 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_EQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3344 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3341 "slghparse.cc" /* yacc.c:1646 */ break; case 207: -#line 418 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 420 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_NOTEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3350 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3347 "slghparse.cc" /* yacc.c:1646 */ break; case 208: -#line 419 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 421 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_LESS,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3356 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3353 "slghparse.cc" /* yacc.c:1646 */ break; case 209: -#line 420 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 422 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_LESS,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3362 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3359 "slghparse.cc" /* yacc.c:1646 */ break; case 210: -#line 421 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 423 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_LESSEQUAL,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3368 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3365 "slghparse.cc" /* yacc.c:1646 */ break; case 211: -#line 422 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 424 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_LESSEQUAL,(yyvsp[0].tree),(yyvsp[-2].tree)); } -#line 3374 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3371 "slghparse.cc" /* yacc.c:1646 */ break; case 212: -#line 423 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 425 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_ADD,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3380 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3377 "slghparse.cc" /* yacc.c:1646 */ break; case 213: -#line 424 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 426 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_SUB,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3386 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3383 "slghparse.cc" /* yacc.c:1646 */ break; case 214: -#line 425 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 427 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_MULT,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3392 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3389 "slghparse.cc" /* yacc.c:1646 */ break; case 215: -#line 426 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 428 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_DIV,(yyvsp[-2].tree),(yyvsp[0].tree)); } -#line 3398 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3395 "slghparse.cc" /* yacc.c:1646 */ break; case 216: -#line 427 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 429 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_NEG,(yyvsp[0].tree)); } -#line 3404 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3401 "slghparse.cc" /* yacc.c:1646 */ break; case 217: -#line 428 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 430 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_ABS,(yyvsp[-1].tree)); } -#line 3410 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3407 "slghparse.cc" /* yacc.c:1646 */ break; case 218: -#line 429 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 431 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_SQRT,(yyvsp[-1].tree)); } -#line 3416 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3413 "slghparse.cc" /* yacc.c:1646 */ break; case 219: -#line 430 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 432 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SEXT,(yyvsp[-1].tree)); } -#line 3422 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3419 "slghparse.cc" /* yacc.c:1646 */ break; case 220: -#line 431 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 433 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_ZEXT,(yyvsp[-1].tree)); } -#line 3428 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3425 "slghparse.cc" /* yacc.c:1646 */ break; case 221: -#line 432 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 434 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_CARRY,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 3434 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3431 "slghparse.cc" /* yacc.c:1646 */ break; case 222: -#line 433 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 435 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SCARRY,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 3440 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3437 "slghparse.cc" /* yacc.c:1646 */ break; case 223: -#line 434 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 436 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_INT_SBORROW,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 3446 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3443 "slghparse.cc" /* yacc.c:1646 */ break; case 224: -#line 435 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 437 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_FLOAT2FLOAT,(yyvsp[-1].tree)); } -#line 3452 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3449 "slghparse.cc" /* yacc.c:1646 */ break; case 225: -#line 436 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 438 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_INT2FLOAT,(yyvsp[-1].tree)); } -#line 3458 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3455 "slghparse.cc" /* yacc.c:1646 */ break; case 226: -#line 437 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 439 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_NAN,(yyvsp[-1].tree)); } -#line 3464 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3461 "slghparse.cc" /* yacc.c:1646 */ break; case 227: -#line 438 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 440 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_TRUNC,(yyvsp[-1].tree)); } -#line 3470 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3467 "slghparse.cc" /* yacc.c:1646 */ break; case 228: -#line 439 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 441 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_CEIL,(yyvsp[-1].tree)); } -#line 3476 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3473 "slghparse.cc" /* yacc.c:1646 */ break; case 229: -#line 440 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 442 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_FLOOR,(yyvsp[-1].tree)); } -#line 3482 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3479 "slghparse.cc" /* yacc.c:1646 */ break; case 230: -#line 441 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 443 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_FLOAT_ROUND,(yyvsp[-1].tree)); } -#line 3488 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3485 "slghparse.cc" /* yacc.c:1646 */ break; case 231: -#line 442 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 444 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_NEW,(yyvsp[-1].tree)); } -#line 3494 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3491 "slghparse.cc" /* yacc.c:1646 */ break; case 232: -#line 443 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 445 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_NEW,(yyvsp[-3].tree),(yyvsp[-1].tree)); } -#line 3500 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3497 "slghparse.cc" /* yacc.c:1646 */ break; case 233: -#line 444 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 446 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_POPCOUNT,(yyvsp[-1].tree)); } -#line 3506 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3503 "slghparse.cc" /* yacc.c:1646 */ break; case 234: -#line 445 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 447 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createOp(CPUI_SUBPIECE,new ExprTree((yyvsp[-3].specsym)->getVarnode()),new ExprTree((yyvsp[-1].varnode))); } -#line 3512 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3509 "slghparse.cc" /* yacc.c:1646 */ break; case 235: -#line 446 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 448 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createBitRange((yyvsp[-2].specsym),0,(uint4)(*(yyvsp[0].i) * 8)); delete (yyvsp[0].i); } -#line 3518 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3515 "slghparse.cc" /* yacc.c:1646 */ break; case 236: -#line 447 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 449 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createBitRange((yyvsp[-5].specsym),(uint4)*(yyvsp[-3].i),(uint4)*(yyvsp[-1].i)); delete (yyvsp[-3].i), delete (yyvsp[-1].i); } -#line 3524 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3521 "slghparse.cc" /* yacc.c:1646 */ break; case 237: -#line 448 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 450 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree)=slgh->pcode.createBitRange((yyvsp[0].bitsym)->getParentSymbol(),(yyvsp[0].bitsym)->getBitOffset(),(yyvsp[0].bitsym)->numBits()); } -#line 3530 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3527 "slghparse.cc" /* yacc.c:1646 */ break; case 238: -#line 449 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 451 "slghparse.y" /* yacc.c:1646 */ { (yyval.tree) = slgh->pcode.createUserOp((yyvsp[-3].useropsym),(yyvsp[-1].param)); } -#line 3536 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3533 "slghparse.cc" /* yacc.c:1646 */ break; case 239: -#line 450 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 452 "slghparse.y" /* yacc.c:1646 */ { if ((*(yyvsp[-1].param)).size() < 2) { string errmsg = "Must at least two inputs to cpool"; yyerror(errmsg.c_str()); YYERROR; } (yyval.tree) = slgh->pcode.createVariadic(CPUI_CPOOLREF,(yyvsp[-1].param)); } -#line 3542 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3539 "slghparse.cc" /* yacc.c:1646 */ break; case 240: -#line 452 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 454 "slghparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = *(yyvsp[0].i); delete (yyvsp[0].i); (yyval.starqual)->id=ConstTpl((yyvsp[-3].spacesym)->getSpace()); } -#line 3548 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3545 "slghparse.cc" /* yacc.c:1646 */ break; case 241: -#line 453 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 455 "slghparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = 0; (yyval.starqual)->id=ConstTpl((yyvsp[-1].spacesym)->getSpace()); } -#line 3554 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3551 "slghparse.cc" /* yacc.c:1646 */ break; case 242: -#line 454 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 456 "slghparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = *(yyvsp[0].i); delete (yyvsp[0].i); (yyval.starqual)->id=ConstTpl(slgh->getDefaultCodeSpace()); } -#line 3560 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3557 "slghparse.cc" /* yacc.c:1646 */ break; case 243: -#line 455 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 457 "slghparse.y" /* yacc.c:1646 */ { (yyval.starqual) = new StarQuality; (yyval.starqual)->size = 0; (yyval.starqual)->id=ConstTpl(slgh->getDefaultCodeSpace()); } -#line 3566 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3563 "slghparse.cc" /* yacc.c:1646 */ break; case 244: -#line 457 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 459 "slghparse.y" /* yacc.c:1646 */ { VarnodeTpl *sym = (yyvsp[0].startsym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } -#line 3572 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3569 "slghparse.cc" /* yacc.c:1646 */ break; case 245: -#line 458 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 460 "slghparse.y" /* yacc.c:1646 */ { VarnodeTpl *sym = (yyvsp[0].endsym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } -#line 3578 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3575 "slghparse.cc" /* yacc.c:1646 */ break; case 246: -#line 459 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::j_curspace_size)); delete (yyvsp[0].i); } -#line 3584 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 461 "slghparse.y" /* yacc.c:1646 */ + { VarnodeTpl *sym = (yyvsp[0].next2sym)->getVarnode(); (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } +#line 3581 "slghparse.cc" /* yacc.c:1646 */ break; case 247: -#line 460 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } -#line 3590 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 462 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::j_curspace_size)); delete (yyvsp[0].i); } +#line 3587 "slghparse.cc" /* yacc.c:1646 */ break; case 248: -#line 461 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].operandsym)->getVarnode(); (yyvsp[0].operandsym)->setCodeAddress(); } -#line 3596 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 463 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } +#line 3593 "slghparse.cc" /* yacc.c:1646 */ break; case 249: -#line 462 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { AddrSpace *spc = (yyvsp[-1].spacesym)->getSpace(); (yyval.varnode) = new VarnodeTpl(ConstTpl(spc),ConstTpl(ConstTpl::real,*(yyvsp[-3].i)),ConstTpl(ConstTpl::real,spc->getAddrSize())); delete (yyvsp[-3].i); } -#line 3602 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 464 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].operandsym)->getVarnode(); (yyvsp[0].operandsym)->setCodeAddress(); } +#line 3599 "slghparse.cc" /* yacc.c:1646 */ break; case 250: -#line 463 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::j_relative,(yyvsp[0].labelsym)->getIndex()),ConstTpl(ConstTpl::real,sizeof(uintm))); (yyvsp[0].labelsym)->incrementRefCount(); } -#line 3608 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 465 "slghparse.y" /* yacc.c:1646 */ + { AddrSpace *spc = (yyvsp[-1].spacesym)->getSpace(); (yyval.varnode) = new VarnodeTpl(ConstTpl(spc),ConstTpl(ConstTpl::real,*(yyvsp[-3].i)),ConstTpl(ConstTpl::real,spc->getAddrSize())); delete (yyvsp[-3].i); } +#line 3605 "slghparse.cc" /* yacc.c:1646 */ break; case 251: -#line 464 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Unknown jump destination: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 3614 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 466 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::j_relative,(yyvsp[0].labelsym)->getIndex()),ConstTpl(ConstTpl::real,sizeof(uintm))); (yyvsp[0].labelsym)->incrementRefCount(); } +#line 3611 "slghparse.cc" /* yacc.c:1646 */ break; case 252: -#line 466 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } -#line 3620 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 467 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Unknown jump destination: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 3617 "slghparse.cc" /* yacc.c:1646 */ break; case 253: -#line 467 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].varnode); } -#line 3626 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 469 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } +#line 3623 "slghparse.cc" /* yacc.c:1646 */ break; case 254: -#line 468 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Unknown varnode parameter: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 3632 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 470 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].varnode); } +#line 3629 "slghparse.cc" /* yacc.c:1646 */ break; case 255: -#line 469 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } -#line 3638 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 471 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Unknown varnode parameter: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 3635 "slghparse.cc" /* yacc.c:1646 */ break; case 256: -#line 471 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::real,0)); delete (yyvsp[0].i); } -#line 3644 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 472 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } +#line 3641 "slghparse.cc" /* yacc.c:1646 */ break; case 257: -#line 472 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::real,0)); yyerror("Parsed integer is too big (overflow)"); } -#line 3650 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 474 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[0].i)),ConstTpl(ConstTpl::real,0)); delete (yyvsp[0].i); } +#line 3647 "slghparse.cc" /* yacc.c:1646 */ break; case 258: -#line 473 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } -#line 3656 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 475 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::real,0)); yyerror("Parsed integer is too big (overflow)"); } +#line 3653 "slghparse.cc" /* yacc.c:1646 */ break; case 259: -#line 474 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),0); } -#line 3662 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 476 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } +#line 3659 "slghparse.cc" /* yacc.c:1646 */ break; case 260: -#line 475 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 3668 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 477 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),0); } +#line 3665 "slghparse.cc" /* yacc.c:1646 */ break; case 261: -#line 477 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } -#line 3674 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 478 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } +#line 3671 "slghparse.cc" /* yacc.c:1646 */ break; case 262: -#line 478 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Unknown assignment varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 3680 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 480 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } +#line 3677 "slghparse.cc" /* yacc.c:1646 */ break; case 263: -#line 479 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } -#line 3686 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 481 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Unknown assignment varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 3683 "slghparse.cc" /* yacc.c:1646 */ break; case 264: -#line 481 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.labelsym) = (yyvsp[-1].labelsym); } -#line 3692 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 482 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } +#line 3689 "slghparse.cc" /* yacc.c:1646 */ break; case 265: -#line 482 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.labelsym) = slgh->pcode.defineLabel( (yyvsp[-1].str) ); } -#line 3698 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 484 "slghparse.y" /* yacc.c:1646 */ + { (yyval.labelsym) = (yyvsp[-1].labelsym); } +#line 3695 "slghparse.cc" /* yacc.c:1646 */ break; case 266: -#line 484 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } -#line 3704 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 485 "slghparse.y" /* yacc.c:1646 */ + { (yyval.labelsym) = slgh->pcode.defineLabel( (yyvsp[-1].str) ); } +#line 3701 "slghparse.cc" /* yacc.c:1646 */ break; case 267: -#line 485 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),0); } -#line 3710 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 487 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = (yyvsp[0].specsym)->getVarnode(); } +#line 3707 "slghparse.cc" /* yacc.c:1646 */ break; case 268: -#line 486 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } -#line 3716 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 488 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),0); } +#line 3713 "slghparse.cc" /* yacc.c:1646 */ break; case 269: -#line 487 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } -#line 3722 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 489 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = slgh->pcode.addressOf((yyvsp[0].varnode),*(yyvsp[-1].i)); delete (yyvsp[-1].i); } +#line 3719 "slghparse.cc" /* yacc.c:1646 */ break; case 270: -#line 488 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg="Unknown export varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 3728 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 490 "slghparse.y" /* yacc.c:1646 */ + { (yyval.varnode) = new VarnodeTpl(ConstTpl(slgh->getConstantSpace()),ConstTpl(ConstTpl::real,*(yyvsp[-2].i)),ConstTpl(ConstTpl::real,*(yyvsp[0].i))); delete (yyvsp[-2].i); delete (yyvsp[0].i); } +#line 3725 "slghparse.cc" /* yacc.c:1646 */ break; case 271: -#line 489 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } -#line 3734 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 491 "slghparse.y" /* yacc.c:1646 */ + { string errmsg="Unknown export varnode: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 3731 "slghparse.cc" /* yacc.c:1646 */ break; case 272: -#line 491 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.famsym) = (yyvsp[0].valuesym); } -#line 3740 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 492 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = "Subtable not attached to operand: "+(yyvsp[0].subtablesym)->getName(); yyerror(errmsg.c_str()); YYERROR; } +#line 3737 "slghparse.cc" /* yacc.c:1646 */ break; case 273: -#line 492 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.famsym) = (yyvsp[0].valuemapsym); } -#line 3746 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 494 "slghparse.y" /* yacc.c:1646 */ + { (yyval.famsym) = (yyvsp[0].valuesym); } +#line 3743 "slghparse.cc" /* yacc.c:1646 */ break; case 274: -#line 493 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.famsym) = (yyvsp[0].contextsym); } -#line 3752 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 495 "slghparse.y" /* yacc.c:1646 */ + { (yyval.famsym) = (yyvsp[0].valuemapsym); } +#line 3749 "slghparse.cc" /* yacc.c:1646 */ break; case 275: -#line 494 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.famsym) = (yyvsp[0].namesym); } -#line 3758 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 496 "slghparse.y" /* yacc.c:1646 */ + { (yyval.famsym) = (yyvsp[0].contextsym); } +#line 3755 "slghparse.cc" /* yacc.c:1646 */ break; case 276: -#line 495 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.famsym) = (yyvsp[0].varlistsym); } -#line 3764 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 497 "slghparse.y" /* yacc.c:1646 */ + { (yyval.famsym) = (yyvsp[0].namesym); } +#line 3761 "slghparse.cc" /* yacc.c:1646 */ break; case 277: -#line 497 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].varsym); } -#line 3770 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 498 "slghparse.y" /* yacc.c:1646 */ + { (yyval.famsym) = (yyvsp[0].varlistsym); } +#line 3767 "slghparse.cc" /* yacc.c:1646 */ break; case 278: -#line 498 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].specsym); } -#line 3776 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 500 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].varsym); } +#line 3773 "slghparse.cc" /* yacc.c:1646 */ break; case 279: -#line 499 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].operandsym); } -#line 3782 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 501 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].specsym); } +#line 3779 "slghparse.cc" /* yacc.c:1646 */ break; case 280: -#line 500 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].startsym); } -#line 3788 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 502 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].operandsym); } +#line 3785 "slghparse.cc" /* yacc.c:1646 */ break; case 281: -#line 501 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.specsym) = (yyvsp[0].endsym); } -#line 3794 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 503 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].startsym); } +#line 3791 "slghparse.cc" /* yacc.c:1646 */ break; case 282: -#line 503 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.str) = new string; (*(yyval.str)) += (yyvsp[0].ch); } -#line 3800 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 504 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].endsym); } +#line 3797 "slghparse.cc" /* yacc.c:1646 */ break; case 283: -#line 504 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.str) = (yyvsp[-1].str); (*(yyval.str)) += (yyvsp[0].ch); } -#line 3806 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 505 "slghparse.y" /* yacc.c:1646 */ + { (yyval.specsym) = (yyvsp[0].next2sym); } +#line 3803 "slghparse.cc" /* yacc.c:1646 */ break; case 284: -#line 506 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.biglist) = (yyvsp[-1].biglist); } -#line 3812 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 507 "slghparse.y" /* yacc.c:1646 */ + { (yyval.str) = new string; (*(yyval.str)) += (yyvsp[0].ch); } +#line 3809 "slghparse.cc" /* yacc.c:1646 */ break; case 285: -#line 507 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.biglist) = new vector; (yyval.biglist)->push_back(intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3818 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 508 "slghparse.y" /* yacc.c:1646 */ + { (yyval.str) = (yyvsp[-1].str); (*(yyval.str)) += (yyvsp[0].ch); } +#line 3815 "slghparse.cc" /* yacc.c:1646 */ break; case 286: -#line 508 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.biglist) = new vector; (yyval.biglist)->push_back(-intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3824 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 510 "slghparse.y" /* yacc.c:1646 */ + { (yyval.biglist) = (yyvsp[-1].biglist); } +#line 3821 "slghparse.cc" /* yacc.c:1646 */ break; case 287: -#line 510 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 511 "slghparse.y" /* yacc.c:1646 */ { (yyval.biglist) = new vector; (yyval.biglist)->push_back(intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3830 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3827 "slghparse.cc" /* yacc.c:1646 */ break; case 288: -#line 511 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 512 "slghparse.y" /* yacc.c:1646 */ { (yyval.biglist) = new vector; (yyval.biglist)->push_back(-intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3836 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3833 "slghparse.cc" /* yacc.c:1646 */ break; case 289: -#line 512 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { if (*(yyvsp[0].str)!="_") { string errmsg = "Expecting integer but saw: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } - (yyval.biglist) = new vector; (yyval.biglist)->push_back((intb)0xBADBEEF); delete (yyvsp[0].str); } -#line 3843 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 514 "slghparse.y" /* yacc.c:1646 */ + { (yyval.biglist) = new vector; (yyval.biglist)->push_back(intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } +#line 3839 "slghparse.cc" /* yacc.c:1646 */ break; case 290: -#line 514 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.biglist) = (yyvsp[-1].biglist); (yyval.biglist)->push_back(intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3849 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 515 "slghparse.y" /* yacc.c:1646 */ + { (yyval.biglist) = new vector; (yyval.biglist)->push_back(-intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } +#line 3845 "slghparse.cc" /* yacc.c:1646 */ break; case 291: -#line 515 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.biglist) = (yyvsp[-2].biglist); (yyval.biglist)->push_back(-intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } -#line 3855 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 516 "slghparse.y" /* yacc.c:1646 */ + { if (*(yyvsp[0].str)!="_") { string errmsg = "Expecting integer but saw: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } + (yyval.biglist) = new vector; (yyval.biglist)->push_back((intb)0xBADBEEF); delete (yyvsp[0].str); } +#line 3852 "slghparse.cc" /* yacc.c:1646 */ break; case 292: -#line 516 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { if (*(yyvsp[0].str)!="_") { string errmsg = "Expecting integer but saw: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } - (yyval.biglist) = (yyvsp[-1].biglist); (yyval.biglist)->push_back((intb)0xBADBEEF); delete (yyvsp[0].str); } -#line 3862 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 518 "slghparse.y" /* yacc.c:1646 */ + { (yyval.biglist) = (yyvsp[-1].biglist); (yyval.biglist)->push_back(intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } +#line 3858 "slghparse.cc" /* yacc.c:1646 */ break; case 293: -#line 519 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-1].strlist); } -#line 3868 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 519 "slghparse.y" /* yacc.c:1646 */ + { (yyval.biglist) = (yyvsp[-2].biglist); (yyval.biglist)->push_back(-intb(*(yyvsp[0].i))); delete (yyvsp[0].i); } +#line 3864 "slghparse.cc" /* yacc.c:1646 */ break; case 294: -#line 520 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 3874 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 520 "slghparse.y" /* yacc.c:1646 */ + { if (*(yyvsp[0].str)!="_") { string errmsg = "Expecting integer but saw: "+*(yyvsp[0].str); delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } + (yyval.biglist) = (yyvsp[-1].biglist); (yyval.biglist)->push_back((intb)0xBADBEEF); delete (yyvsp[0].str); } +#line 3871 "slghparse.cc" /* yacc.c:1646 */ break; case 295: -#line 522 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; (yyval.strlist)->push_back( *(yyvsp[0].str) ); delete (yyvsp[0].str); } -#line 3880 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 523 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-1].strlist); } +#line 3877 "slghparse.cc" /* yacc.c:1646 */ break; case 296: -#line 523 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 3886 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 524 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } +#line 3883 "slghparse.cc" /* yacc.c:1646 */ break; case 297: -#line 524 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = (yyvsp[0].anysym)->getName()+": redefined"; yyerror(errmsg.c_str()); YYERROR; } -#line 3892 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 526 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; (yyval.strlist)->push_back( *(yyvsp[0].str) ); delete (yyvsp[0].str); } +#line 3889 "slghparse.cc" /* yacc.c:1646 */ break; case 298: -#line 526 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-1].strlist); } -#line 3898 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 527 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } +#line 3895 "slghparse.cc" /* yacc.c:1646 */ break; case 299: -#line 528 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; (yyval.strlist)->push_back( *(yyvsp[0].str) ); delete (yyvsp[0].str); } -#line 3904 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 528 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = (yyvsp[0].anysym)->getName()+": redefined"; yyerror(errmsg.c_str()); YYERROR; } +#line 3901 "slghparse.cc" /* yacc.c:1646 */ break; case 300: -#line 529 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; (yyval.strlist)->push_back( (yyvsp[0].anysym)->getName() ); } -#line 3910 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 530 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-1].strlist); } +#line 3907 "slghparse.cc" /* yacc.c:1646 */ break; case 301: -#line 530 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 3916 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 532 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; (yyval.strlist)->push_back( *(yyvsp[0].str) ); delete (yyvsp[0].str); } +#line 3913 "slghparse.cc" /* yacc.c:1646 */ break; case 302: -#line 531 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back((yyvsp[0].anysym)->getName()); } -#line 3922 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 533 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; (yyval.strlist)->push_back( (yyvsp[0].anysym)->getName() ); } +#line 3919 "slghparse.cc" /* yacc.c:1646 */ break; case 303: -#line 533 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = (yyvsp[-1].symlist); } -#line 3928 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 534 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } +#line 3925 "slghparse.cc" /* yacc.c:1646 */ break; case 304: -#line 534 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].valuesym)); } -#line 3934 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 535 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-1].strlist); (yyval.strlist)->push_back((yyvsp[0].anysym)->getName()); } +#line 3931 "slghparse.cc" /* yacc.c:1646 */ break; case 305: -#line 535 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].contextsym)); } -#line 3940 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 537 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = (yyvsp[-1].symlist); } +#line 3937 "slghparse.cc" /* yacc.c:1646 */ break; case 306: -#line 537 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = new vector; (yyval.symlist)->push_back( (yyvsp[0].valuesym) ); } -#line 3946 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 538 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].valuesym)); } +#line 3943 "slghparse.cc" /* yacc.c:1646 */ break; case 307: -#line 538 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 539 "slghparse.y" /* yacc.c:1646 */ { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].contextsym)); } -#line 3952 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 3949 "slghparse.cc" /* yacc.c:1646 */ break; case 308: -#line 539 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].valuesym)); } -#line 3958 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 541 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = new vector; (yyval.symlist)->push_back( (yyvsp[0].valuesym) ); } +#line 3955 "slghparse.cc" /* yacc.c:1646 */ break; case 309: -#line 540 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].contextsym)); } -#line 3964 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 542 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].contextsym)); } +#line 3961 "slghparse.cc" /* yacc.c:1646 */ break; case 310: -#line 541 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { string errmsg = *(yyvsp[0].str)+": is not a value pattern"; delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } -#line 3970 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 543 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].valuesym)); } +#line 3967 "slghparse.cc" /* yacc.c:1646 */ break; case 311: -#line 543 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = (yyvsp[-1].symlist); } -#line 3976 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 544 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].contextsym)); } +#line 3973 "slghparse.cc" /* yacc.c:1646 */ break; case 312: -#line 544 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].varsym)); } -#line 3982 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 545 "slghparse.y" /* yacc.c:1646 */ + { string errmsg = *(yyvsp[0].str)+": is not a value pattern"; delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } +#line 3979 "slghparse.cc" /* yacc.c:1646 */ break; case 313: -#line 546 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].varsym)); } -#line 3988 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 547 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = (yyvsp[-1].symlist); } +#line 3985 "slghparse.cc" /* yacc.c:1646 */ break; case 314: -#line 547 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { if (*(yyvsp[0].str)!="_") { string errmsg = *(yyvsp[0].str)+": is not a varnode symbol"; delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } - (yyval.symlist) = new vector; (yyval.symlist)->push_back((SleighSymbol *)0); delete (yyvsp[0].str); } -#line 3995 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 548 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].varsym)); } +#line 3991 "slghparse.cc" /* yacc.c:1646 */ break; case 315: -#line 549 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].varsym)); } -#line 4001 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 550 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = new vector; (yyval.symlist)->push_back((yyvsp[0].varsym)); } +#line 3997 "slghparse.cc" /* yacc.c:1646 */ break; case 316: -#line 550 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 551 "slghparse.y" /* yacc.c:1646 */ { if (*(yyvsp[0].str)!="_") { string errmsg = *(yyvsp[0].str)+": is not a varnode symbol"; delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } - (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((SleighSymbol *)0); delete (yyvsp[0].str); } -#line 4008 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ + (yyval.symlist) = new vector; (yyval.symlist)->push_back((SleighSymbol *)0); delete (yyvsp[0].str); } +#line 4004 "slghparse.cc" /* yacc.c:1646 */ break; case 317: -#line 553 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.param) = new vector; } -#line 4014 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 553 "slghparse.y" /* yacc.c:1646 */ + { (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((yyvsp[0].varsym)); } +#line 4010 "slghparse.cc" /* yacc.c:1646 */ break; case 318: -#line 554 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.param) = new vector; (yyval.param)->push_back((yyvsp[0].tree)); } -#line 4020 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 554 "slghparse.y" /* yacc.c:1646 */ + { if (*(yyvsp[0].str)!="_") { string errmsg = *(yyvsp[0].str)+": is not a varnode symbol"; delete (yyvsp[0].str); yyerror(errmsg.c_str()); YYERROR; } + (yyval.symlist) = (yyvsp[-1].symlist); (yyval.symlist)->push_back((SleighSymbol *)0); delete (yyvsp[0].str); } +#line 4017 "slghparse.cc" /* yacc.c:1646 */ break; case 319: -#line 555 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.param) = (yyvsp[-2].param); (yyval.param)->push_back((yyvsp[0].tree)); } -#line 4026 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 557 "slghparse.y" /* yacc.c:1646 */ + { (yyval.param) = new vector; } +#line 4023 "slghparse.cc" /* yacc.c:1646 */ break; case 320: -#line 557 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; } -#line 4032 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 558 "slghparse.y" /* yacc.c:1646 */ + { (yyval.param) = new vector; (yyval.param)->push_back((yyvsp[0].tree)); } +#line 4029 "slghparse.cc" /* yacc.c:1646 */ break; case 321: -#line 558 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = new vector; (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 4038 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 559 "slghparse.y" /* yacc.c:1646 */ + { (yyval.param) = (yyvsp[-2].param); (yyval.param)->push_back((yyvsp[0].tree)); } +#line 4035 "slghparse.cc" /* yacc.c:1646 */ break; case 322: -#line 559 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.strlist) = (yyvsp[-2].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } -#line 4044 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 561 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; } +#line 4041 "slghparse.cc" /* yacc.c:1646 */ break; case 323: -#line 561 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].spacesym); } -#line 4050 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 562 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = new vector; (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } +#line 4047 "slghparse.cc" /* yacc.c:1646 */ break; case 324: -#line 562 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].sectionsym); } -#line 4056 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 563 "slghparse.y" /* yacc.c:1646 */ + { (yyval.strlist) = (yyvsp[-2].strlist); (yyval.strlist)->push_back(*(yyvsp[0].str)); delete (yyvsp[0].str); } +#line 4053 "slghparse.cc" /* yacc.c:1646 */ break; case 325: -#line 563 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].tokensym); } -#line 4062 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 565 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].spacesym); } +#line 4059 "slghparse.cc" /* yacc.c:1646 */ break; case 326: -#line 564 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].useropsym); } -#line 4068 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 566 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].sectionsym); } +#line 4065 "slghparse.cc" /* yacc.c:1646 */ break; case 327: -#line 565 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].macrosym); } -#line 4074 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 567 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].tokensym); } +#line 4071 "slghparse.cc" /* yacc.c:1646 */ break; case 328: -#line 566 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].subtablesym); } -#line 4080 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 568 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].useropsym); } +#line 4077 "slghparse.cc" /* yacc.c:1646 */ break; case 329: -#line 567 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].valuesym); } -#line 4086 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 569 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].macrosym); } +#line 4083 "slghparse.cc" /* yacc.c:1646 */ break; case 330: -#line 568 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].valuemapsym); } -#line 4092 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 570 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].subtablesym); } +#line 4089 "slghparse.cc" /* yacc.c:1646 */ break; case 331: -#line 569 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].contextsym); } -#line 4098 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 571 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].valuesym); } +#line 4095 "slghparse.cc" /* yacc.c:1646 */ break; case 332: -#line 570 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].namesym); } -#line 4104 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 572 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].valuemapsym); } +#line 4101 "slghparse.cc" /* yacc.c:1646 */ break; case 333: -#line 571 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].varsym); } -#line 4110 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 573 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].contextsym); } +#line 4107 "slghparse.cc" /* yacc.c:1646 */ break; case 334: -#line 572 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].varlistsym); } -#line 4116 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 574 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].namesym); } +#line 4113 "slghparse.cc" /* yacc.c:1646 */ break; case 335: -#line 573 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].operandsym); } -#line 4122 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 575 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].varsym); } +#line 4119 "slghparse.cc" /* yacc.c:1646 */ break; case 336: -#line 574 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].startsym); } -#line 4128 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 576 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].varlistsym); } +#line 4125 "slghparse.cc" /* yacc.c:1646 */ break; case 337: -#line 575 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ - { (yyval.anysym) = (yyvsp[0].endsym); } -#line 4134 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 577 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].operandsym); } +#line 4131 "slghparse.cc" /* yacc.c:1646 */ break; case 338: -#line 576 "src/decompile/cpp/slghparse.y" /* yacc.c:1646 */ +#line 578 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].startsym); } +#line 4137 "slghparse.cc" /* yacc.c:1646 */ + break; + + case 339: +#line 579 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].endsym); } +#line 4143 "slghparse.cc" /* yacc.c:1646 */ + break; + + case 340: +#line 580 "slghparse.y" /* yacc.c:1646 */ + { (yyval.anysym) = (yyvsp[0].next2sym); } +#line 4149 "slghparse.cc" /* yacc.c:1646 */ + break; + + case 341: +#line 581 "slghparse.y" /* yacc.c:1646 */ { (yyval.anysym) = (yyvsp[0].bitsym); } -#line 4140 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 4155 "slghparse.cc" /* yacc.c:1646 */ break; -#line 4144 "src/decompile/cpp/slghparse.cc" /* yacc.c:1646 */ +#line 4159 "slghparse.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4383,7 +4398,7 @@ yyreturn: #endif return yyresult; } -#line 578 "src/decompile/cpp/slghparse.y" /* yacc.c:1906 */ +#line 583 "slghparse.y" /* yacc.c:1906 */ int yyerror(const char *s) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.hh index 1df3ac4533..f52fe7abbb 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.hh @@ -45,8 +45,8 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED -# define YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED +#ifndef YY_YY_SLGHPARSE_HH_INCLUDED +# define YY_YY_SLGHPARSE_HH_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -168,9 +168,10 @@ extern int yydebug; OPERANDSYM = 363, STARTSYM = 364, ENDSYM = 365, - MACROSYM = 366, - LABELSYM = 367, - SUBTABLESYM = 368 + NEXT2SYM = 366, + MACROSYM = 367, + LABELSYM = 368, + SUBTABLESYM = 369 }; #endif @@ -179,7 +180,7 @@ extern int yydebug; union YYSTYPE { -#line 29 "src/decompile/cpp/slghparse.y" /* yacc.c:1909 */ +#line 29 "slghparse.y" /* yacc.c:1909 */ char ch; uintb *i; @@ -212,6 +213,7 @@ union YYSTYPE SubtableSymbol *subtablesym; StartSymbol *startsym; EndSymbol *endsym; + Next2Symbol *next2sym; OperandSymbol *operandsym; VarnodeListSymbol *varlistsym; VarnodeSymbol *varsym; @@ -223,7 +225,7 @@ union YYSTYPE FamilySymbol *famsym; SpecificSymbol *specsym; -#line 212 "src/decompile/cpp/slghparse.hh" /* yacc.c:1909 */ +#line 214 "slghparse.hh" /* yacc.c:1909 */ }; typedef union YYSTYPE YYSTYPE; @@ -236,4 +238,4 @@ extern YYSTYPE yylval; int yyparse (void); -#endif /* !YY_YY_SRC_DECOMPILE_CPP_SLGHPARSE_HH_INCLUDED */ +#endif /* !YY_YY_SLGHPARSE_HH_INCLUDED */ diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.y b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.y index c34f5a4656..b3fedb7b6e 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.y +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.y @@ -58,6 +58,7 @@ SubtableSymbol *subtablesym; StartSymbol *startsym; EndSymbol *endsym; + Next2Symbol *next2sym; OperandSymbol *operandsym; VarnodeListSymbol *varlistsym; VarnodeSymbol *varsym; @@ -121,6 +122,7 @@ %token OPERANDSYM %token STARTSYM %token ENDSYM +%token NEXT2SYM %token MACROSYM %token LABELSYM %token SUBTABLESYM @@ -331,7 +333,7 @@ contextblock: { $$ = (vector *)0; } | '[' contextlist ']' { $$ = $2; } ; contextlist: { $$ = new vector; } - | contextlist CONTEXTSYM '=' pexpression ';' { $$ = $1; if (!slgh->contextMod($1,$2,$4)) { string errmsg="Cannot use 'inst_next' to set context variable: "+$2->getName(); yyerror(errmsg.c_str()); YYERROR; } } + | contextlist CONTEXTSYM '=' pexpression ';' { $$ = $1; if (!slgh->contextMod($1,$2,$4)) { string errmsg="Cannot use 'inst_next' or 'inst_next2' to set context variable: "+$2->getName(); yyerror(errmsg.c_str()); YYERROR; } } | contextlist GLOBALSET_KEY '(' familysymbol ',' CONTEXTSYM ')' ';' { $$ = $1; slgh->contextSet($1,$4,$6); } | contextlist GLOBALSET_KEY '(' specificsymbol ',' CONTEXTSYM ')' ';' { $$ = $1; slgh->contextSet($1,$4,$6); } | contextlist OPERANDSYM '=' pexpression ';' { $$ = $1; slgh->defineOperand($2,$4); } @@ -456,6 +458,7 @@ sizedstar: '*' '[' SPACESYM ']' ':' INTEGER { $$ = new StarQuality; $$->size = * ; jumpdest: STARTSYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } | ENDSYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } + | NEXT2SYM { VarnodeTpl *sym = $1->getVarnode(); $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),sym->getOffset(),ConstTpl(ConstTpl::j_curspace_size)); delete sym; } | INTEGER { $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,*$1),ConstTpl(ConstTpl::j_curspace_size)); delete $1; } | BADINTEGER { $$ = new VarnodeTpl(ConstTpl(ConstTpl::j_curspace),ConstTpl(ConstTpl::real,0),ConstTpl(ConstTpl::j_curspace_size)); yyerror("Parsed integer is too big (overflow)"); } | OPERANDSYM { $$ = $1->getVarnode(); $1->setCodeAddress(); } @@ -499,6 +502,7 @@ specificsymbol: VARSYM { $$ = $1; } | OPERANDSYM { $$ = $1; } | STARTSYM { $$ = $1; } | ENDSYM { $$ = $1; } + | NEXT2SYM { $$ = $1; } ; charstring: CHAR { $$ = new string; (*$$) += $1; } | charstring CHAR { $$ = $1; (*$$) += $2; } @@ -573,6 +577,7 @@ anysymbol: SPACESYM { $$ = $1; } | OPERANDSYM { $$ = $1; } | STARTSYM { $$ = $1; } | ENDSYM { $$ = $1; } + | NEXT2SYM { $$ = $1; } | BITSYM { $$ = $1; } ; %% diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghpatexpress.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/slghpatexpress.hh index 5d8ee4f616..8c748c2cee 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghpatexpress.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghpatexpress.hh @@ -165,6 +165,19 @@ public: virtual void restoreXml(const Element *el,Translate *trans) {} }; +class Next2InstructionValue : public PatternValue { +public: + Next2InstructionValue(void) {} + virtual intb getValue(ParserWalker &walker) const { + return (intb)AddrSpace::byteToAddress(walker.getN2addr().getOffset(),walker.getN2addr().getSpace()->getWordSize()); } + virtual TokenPattern genMinPattern(const vector &ops) const { return TokenPattern(); } + virtual TokenPattern genPattern(intb val) const { return TokenPattern(); } + virtual intb minValue(void) const { return (intb)0; } + virtual intb maxValue(void) const { return (intb)0; } + virtual void saveXml(ostream &s) const { s << ""; } + virtual void restoreXml(const Element *el,Translate *trans) {} +}; + class Constructor; // Forward declaration class OperandSymbol; class OperandValue : public PatternValue { diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.cc index 1d7c98697d..1ac87e2cd5 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.cc @@ -23,8 +23,8 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 37 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -99,61 +99,65 @@ typedef unsigned int flex_uint32_t; #define UINT32_MAX (4294967295U) #endif -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif - #endif /* ! C99 */ #endif /* ! FLEXINT_H */ -/* begin standard C++ headers. */ +#ifdef __cplusplus -/* TODO: this is always defined, so inline it */ +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST #define yyconst const - -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) #else -#define yynoreturn +#define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * + /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START + /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) +#define YY_NEW_FILE yyrestart(yyin ) + #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -170,16 +174,15 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; typedef size_t yy_size_t; #endif -extern int yyleng; +extern yy_size_t yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -194,6 +197,7 @@ extern FILE *yyin, *yyout; YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) + #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -208,12 +212,12 @@ struct yy_buffer_state /* Size of input buffer in bytes, not including room for EOB * characters. */ - int yy_buf_size; + yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - int yy_n_chars; + yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to @@ -236,7 +240,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -264,7 +268,7 @@ struct yy_buffer_state /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -275,6 +279,7 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) + /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ @@ -282,11 +287,11 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int yyleng; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = NULL; +static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -295,77 +300,80 @@ static int yy_start = 0; /* start state number */ */ static int yy_did_buffer_switch_on_eof; -void yyrestart ( FILE *input_file ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); -void yy_delete_buffer ( YY_BUFFER_STATE b ); -void yy_flush_buffer ( YY_BUFFER_STATE b ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state ( void ); +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); -static void yyensure_buffer_stack ( void ); -static void yy_load_buffer_state ( void ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) -void *yyalloc ( yy_size_t ); -void *yyrealloc ( void *, yy_size_t ); -void yyfree ( void * ); +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); #define yy_new_buffer yy_create_buffer + #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } + #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } + #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) -typedef flex_uint8_t YY_CHAR; +typedef unsigned char YY_CHAR; -FILE *yyin = NULL, *yyout = NULL; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; + int yylineno = 1; extern char *yytext; -#ifdef yytext_ptr -#undef yytext_ptr -#endif #define yytext_ptr yytext -static yy_state_type yy_get_previous_state ( void ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); -static int yy_get_next_buffer ( void ); -static void yynoreturn yy_fatal_error ( const char* msg ); +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ + yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; + #define YY_NUM_RULES 164 #define YY_END_OF_BUFFER 165 /* This struct is not used in this scanner, @@ -375,7 +383,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[527] = +static yyconst flex_int16_t yy_accept[527] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 14, 7, 8, 6, 14, @@ -437,7 +445,7 @@ static const flex_int16_t yy_accept[527] = 51, 139, 51, 51, 31, 0 } ; -static const YY_CHAR yy_ec[256] = +static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, @@ -469,7 +477,7 @@ static const YY_CHAR yy_ec[256] = 11, 11, 11, 11, 11 } ; -static const YY_CHAR yy_meta[67] = +static yyconst flex_int32_t yy_meta[67] = { 0, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 3, 6, @@ -480,7 +488,7 @@ static const YY_CHAR yy_meta[67] = 5, 5, 3, 3, 3, 3 } ; -static const flex_int16_t yy_base[564] = +static yyconst flex_int16_t yy_base[564] = { 0, 0, 931, 66, 930, 132, 929, 198, 928, 264, 927, 330, 926, 0, 394, 955, 962, 396, 962, 0, 942, @@ -546,7 +554,7 @@ static const flex_int16_t yy_base[564] = 666, 669, 672 } ; -static const flex_int16_t yy_def[564] = +static yyconst flex_int16_t yy_def[564] = { 0, 526, 1, 526, 3, 526, 5, 526, 7, 526, 9, 526, 11, 527, 528, 526, 526, 526, 526, 529, 526, @@ -612,7 +620,7 @@ static const flex_int16_t yy_def[564] = 526, 526, 526 } ; -static const flex_int16_t yy_nxt[1029] = +static yyconst flex_int16_t yy_nxt[1029] = { 0, 16, 17, 18, 17, 16, 16, 19, 20, 16, 16, 16, 21, 21, 16, 16, 21, 21, 22, 16, 16, @@ -729,7 +737,7 @@ static const flex_int16_t yy_nxt[1029] = 526, 526, 526, 526, 526, 526, 526, 526 } ; -static const flex_int16_t yy_chk[1029] = +static yyconst flex_int16_t yy_chk[1029] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1117,7 +1125,7 @@ int4 preprocess(int4 cur_state,int4 blank_state) if (yyin == (FILE *)0) preproc_error("Could not open included file "+fname); filebuffers.back().file = yyin; - yy_switch_to_buffer( yy_create_buffer(yyin, YY_BUF_SIZE) ); + yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE) ); check_to_endofline(s); } } @@ -1240,7 +1248,7 @@ void preproc_macroexpand(void) string value; if (!slgh->getPreprocValue(macro,value)) preproc_error("Unknown preprocessing macro "+macro); - yy_switch_to_buffer( yy_scan_string( value.c_str() ) ); + yy_switch_to_buffer(yy_scan_string(value.c_str() ) ); slgh->parsePreprocMacro(); } @@ -1292,6 +1300,9 @@ int4 find_symbol(void) { case SleighSymbol::end_symbol: yylval.endsym = (EndSymbol *)sym; return ENDSYM; + case SleighSymbol::next2_symbol: + yylval.next2sym = (Next2Symbol *)sym; + return NEXT2SYM; case SleighSymbol::subtable_symbol: yylval.subtablesym = (SubtableSymbol *)sym; return SUBTABLESYM; @@ -1342,9 +1353,13 @@ int4 scan_number(char *numtext,YYSTYPE *lval,bool signednum) return INTEGER; } -#line 1331 "slghscan.cc" -#line 1333 "slghscan.cc" + + + + + +#line 1348 "slghscan.cc" #define INITIAL 0 #define defblock 1 @@ -1366,36 +1381,36 @@ int4 scan_number(char *numtext,YYSTYPE *lval,bool signednum) #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals ( void ); +static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy ( void ); +int yylex_destroy (void ); -int yyget_debug ( void ); +int yyget_debug (void ); -void yyset_debug ( int debug_flag ); +void yyset_debug (int debug_flag ); -YY_EXTRA_TYPE yyget_extra ( void ); +YY_EXTRA_TYPE yyget_extra (void ); -void yyset_extra ( YY_EXTRA_TYPE user_defined ); +void yyset_extra (YY_EXTRA_TYPE user_defined ); -FILE *yyget_in ( void ); +FILE *yyget_in (void ); -void yyset_in ( FILE * _in_str ); +void yyset_in (FILE * in_str ); -FILE *yyget_out ( void ); +FILE *yyget_out (void ); -void yyset_out ( FILE * _out_str ); +void yyset_out (FILE * out_str ); - int yyget_leng ( void ); +yy_size_t yyget_leng (void ); -char *yyget_text ( void ); +char *yyget_text (void ); -int yyget_lineno ( void ); +int yyget_lineno (void ); -void yyset_lineno ( int _line_number ); +void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1403,43 +1418,35 @@ void yyset_lineno ( int _line_number ); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap ( void ); +extern "C" int yywrap (void ); #else -extern int yywrap ( void ); +extern int yywrap (void ); #endif #endif -#ifndef YY_NO_UNPUT + static void yyunput (int c,char *buf_ptr ); - static void yyunput ( int c, char *buf_ptr ); - -#endif - #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int ); +static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * ); +static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT + #ifdef __cplusplus -static int yyinput ( void ); +static int yyinput (void ); #else -static int input ( void ); +static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -1447,7 +1454,7 @@ static int input ( void ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -1458,7 +1465,7 @@ static int input ( void ); if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - int n; \ + size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -1471,7 +1478,7 @@ static int input ( void ); else \ { \ errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -1526,7 +1533,7 @@ extern int yylex (void); /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; +#define YY_BREAK break; #endif #define YY_RULE_SETUP \ @@ -1539,10 +1546,15 @@ extern int yylex (void); */ YY_DECL { - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; +#line 493 "slghscan.l" + + +#line 1542 "slghscan.cc" + if ( !(yy_init) ) { (yy_init) = 1; @@ -1563,19 +1575,13 @@ YY_DECL if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE ); + yy_create_buffer(yyin,YY_BUF_SIZE ); } - yy_load_buffer_state( ); + yy_load_buffer_state( ); } - { -#line 490 "slghscan.l" - - -#line 1562 "slghscan.cc" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); @@ -1592,7 +1598,7 @@ YY_DECL yy_match: do { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1602,9 +1608,9 @@ yy_match: { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 527 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 962 ); @@ -1634,830 +1640,830 @@ do_action: /* This label is used only to access EOF actions. */ case 1: /* rule 1 can match eol */ YY_RULE_SETUP -#line 492 "slghscan.l" +#line 495 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(INITIAL,preproc) ); } YY_BREAK case 2: YY_RULE_SETUP -#line 493 "slghscan.l" +#line 496 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 3: YY_RULE_SETUP -#line 494 "slghscan.l" +#line 497 "slghscan.l" { yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 4: YY_RULE_SETUP -#line 495 "slghscan.l" +#line 498 "slghscan.l" { BEGIN(print); slgh->calcContextLayout(); yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 5: YY_RULE_SETUP -#line 496 "slghscan.l" +#line 499 "slghscan.l" { BEGIN(sem); yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 6: YY_RULE_SETUP -#line 497 "slghscan.l" +#line 500 "slghscan.l" YY_BREAK case 7: YY_RULE_SETUP -#line 498 "slghscan.l" +#line 501 "slghscan.l" YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP -#line 499 "slghscan.l" +#line 502 "slghscan.l" { slgh->nextLine(); } YY_BREAK case 9: YY_RULE_SETUP -#line 500 "slghscan.l" +#line 503 "slghscan.l" { BEGIN(macroblock); return MACRO_KEY; } YY_BREAK case 10: YY_RULE_SETUP -#line 501 "slghscan.l" +#line 504 "slghscan.l" { BEGIN(defblock); return DEFINE_KEY; } YY_BREAK case 11: YY_RULE_SETUP -#line 502 "slghscan.l" +#line 505 "slghscan.l" { BEGIN(defblock); slgh->calcContextLayout(); return ATTACH_KEY; } YY_BREAK case 12: YY_RULE_SETUP -#line 503 "slghscan.l" +#line 506 "slghscan.l" { BEGIN(pattern); withsection = 1; slgh->calcContextLayout(); return WITH_KEY; } YY_BREAK case 13: YY_RULE_SETUP -#line 504 "slghscan.l" +#line 507 "slghscan.l" { return find_symbol(); } YY_BREAK case 14: YY_RULE_SETUP -#line 505 "slghscan.l" +#line 508 "slghscan.l" { return yytext[0]; } YY_BREAK case 15: /* rule 15 can match eol */ YY_RULE_SETUP -#line 507 "slghscan.l" +#line 510 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(macroblock,preproc) ); } YY_BREAK case 16: YY_RULE_SETUP -#line 508 "slghscan.l" +#line 511 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 17: YY_RULE_SETUP -#line 509 "slghscan.l" +#line 512 "slghscan.l" { yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 18: YY_RULE_SETUP -#line 510 "slghscan.l" +#line 513 "slghscan.l" { BEGIN(sem); return yytext[0]; } YY_BREAK case 19: YY_RULE_SETUP -#line 511 "slghscan.l" +#line 514 "slghscan.l" { yylval.str = new string(yytext); return STRING; } YY_BREAK case 20: YY_RULE_SETUP -#line 512 "slghscan.l" +#line 515 "slghscan.l" YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP -#line 513 "slghscan.l" +#line 516 "slghscan.l" { slgh->nextLine(); } YY_BREAK case 22: YY_RULE_SETUP -#line 514 "slghscan.l" +#line 517 "slghscan.l" { return yytext[0]; } YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP -#line 516 "slghscan.l" +#line 519 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(defblock,preproc) ); } YY_BREAK case 24: YY_RULE_SETUP -#line 517 "slghscan.l" +#line 520 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 25: YY_RULE_SETUP -#line 518 "slghscan.l" +#line 521 "slghscan.l" { yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 26: YY_RULE_SETUP -#line 519 "slghscan.l" +#line 522 "slghscan.l" { BEGIN(INITIAL); yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 27: YY_RULE_SETUP -#line 520 "slghscan.l" +#line 523 "slghscan.l" { return SPACE_KEY; } YY_BREAK case 28: YY_RULE_SETUP -#line 521 "slghscan.l" +#line 524 "slghscan.l" { return TYPE_KEY; } YY_BREAK case 29: YY_RULE_SETUP -#line 522 "slghscan.l" +#line 525 "slghscan.l" { return RAM_KEY; } YY_BREAK case 30: YY_RULE_SETUP -#line 523 "slghscan.l" +#line 526 "slghscan.l" { return DEFAULT_KEY; } YY_BREAK case 31: YY_RULE_SETUP -#line 524 "slghscan.l" +#line 527 "slghscan.l" { return REGISTER_KEY; } YY_BREAK case 32: YY_RULE_SETUP -#line 525 "slghscan.l" +#line 528 "slghscan.l" { return TOKEN_KEY; } YY_BREAK case 33: YY_RULE_SETUP -#line 526 "slghscan.l" +#line 529 "slghscan.l" { return CONTEXT_KEY; } YY_BREAK case 34: YY_RULE_SETUP -#line 527 "slghscan.l" +#line 530 "slghscan.l" { return BITRANGE_KEY; } YY_BREAK case 35: YY_RULE_SETUP -#line 528 "slghscan.l" +#line 531 "slghscan.l" { return SIGNED_KEY; } YY_BREAK case 36: YY_RULE_SETUP -#line 529 "slghscan.l" +#line 532 "slghscan.l" { return NOFLOW_KEY; } YY_BREAK case 37: YY_RULE_SETUP -#line 530 "slghscan.l" +#line 533 "slghscan.l" { return HEX_KEY; } YY_BREAK case 38: YY_RULE_SETUP -#line 531 "slghscan.l" +#line 534 "slghscan.l" { return DEC_KEY; } YY_BREAK case 39: YY_RULE_SETUP -#line 532 "slghscan.l" +#line 535 "slghscan.l" { return ENDIAN_KEY; } YY_BREAK case 40: YY_RULE_SETUP -#line 533 "slghscan.l" +#line 536 "slghscan.l" { return ALIGN_KEY; } YY_BREAK case 41: YY_RULE_SETUP -#line 534 "slghscan.l" +#line 537 "slghscan.l" { return BIG_KEY; } YY_BREAK case 42: YY_RULE_SETUP -#line 535 "slghscan.l" +#line 538 "slghscan.l" { return LITTLE_KEY; } YY_BREAK case 43: YY_RULE_SETUP -#line 536 "slghscan.l" +#line 539 "slghscan.l" { return SIZE_KEY; } YY_BREAK case 44: YY_RULE_SETUP -#line 537 "slghscan.l" +#line 540 "slghscan.l" { return WORDSIZE_KEY; } YY_BREAK case 45: YY_RULE_SETUP -#line 538 "slghscan.l" +#line 541 "slghscan.l" { return OFFSET_KEY; } YY_BREAK case 46: YY_RULE_SETUP -#line 539 "slghscan.l" +#line 542 "slghscan.l" { return NAMES_KEY; } YY_BREAK case 47: YY_RULE_SETUP -#line 540 "slghscan.l" +#line 543 "slghscan.l" { return VALUES_KEY; } YY_BREAK case 48: YY_RULE_SETUP -#line 541 "slghscan.l" +#line 544 "slghscan.l" { return VARIABLES_KEY; } YY_BREAK case 49: YY_RULE_SETUP -#line 542 "slghscan.l" +#line 545 "slghscan.l" { return PCODEOP_KEY; } YY_BREAK case 50: YY_RULE_SETUP -#line 543 "slghscan.l" +#line 546 "slghscan.l" YY_BREAK case 51: YY_RULE_SETUP -#line 544 "slghscan.l" +#line 547 "slghscan.l" { return find_symbol(); } YY_BREAK case 52: YY_RULE_SETUP -#line 545 "slghscan.l" +#line 548 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 53: YY_RULE_SETUP -#line 546 "slghscan.l" +#line 549 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 54: YY_RULE_SETUP -#line 547 "slghscan.l" +#line 550 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 55: YY_RULE_SETUP -#line 548 "slghscan.l" +#line 551 "slghscan.l" { yylval.str = new string(yytext+1,strlen(yytext)-2); return STRING; } YY_BREAK case 56: YY_RULE_SETUP -#line 549 "slghscan.l" +#line 552 "slghscan.l" YY_BREAK case 57: /* rule 57 can match eol */ YY_RULE_SETUP -#line 550 "slghscan.l" +#line 553 "slghscan.l" { slgh->nextLine(); } YY_BREAK case 58: YY_RULE_SETUP -#line 551 "slghscan.l" +#line 554 "slghscan.l" { return yytext[0]; } YY_BREAK case 59: /* rule 59 can match eol */ YY_RULE_SETUP -#line 554 "slghscan.l" +#line 557 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(print,preproc) ); } YY_BREAK case 60: YY_RULE_SETUP -#line 555 "slghscan.l" +#line 558 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 61: YY_RULE_SETUP -#line 556 "slghscan.l" +#line 559 "slghscan.l" { yylval.ch = yytext[0]; return CHAR; } YY_BREAK case 62: YY_RULE_SETUP -#line 557 "slghscan.l" +#line 560 "slghscan.l" { yylval.ch = '^'; return '^'; } YY_BREAK case 63: YY_RULE_SETUP -#line 558 "slghscan.l" +#line 561 "slghscan.l" { BEGIN(pattern); actionon=0; return IS_KEY; } YY_BREAK case 64: YY_RULE_SETUP -#line 559 "slghscan.l" +#line 562 "slghscan.l" { yylval.str = new string(yytext); return SYMBOLSTRING; } YY_BREAK case 65: YY_RULE_SETUP -#line 560 "slghscan.l" +#line 563 "slghscan.l" { yylval.str = new string(yytext+1,strlen(yytext)-2); return STRING; } YY_BREAK case 66: YY_RULE_SETUP -#line 561 "slghscan.l" +#line 564 "slghscan.l" { yylval.ch = ' '; return ' '; } YY_BREAK case 67: /* rule 67 can match eol */ YY_RULE_SETUP -#line 562 "slghscan.l" +#line 565 "slghscan.l" { slgh->nextLine(); return ' '; } YY_BREAK case 68: YY_RULE_SETUP -#line 563 "slghscan.l" +#line 566 "slghscan.l" { return yytext[0]; } YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP -#line 565 "slghscan.l" +#line 568 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(pattern,preproc) ); } YY_BREAK case 70: YY_RULE_SETUP -#line 566 "slghscan.l" +#line 569 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 71: YY_RULE_SETUP -#line 567 "slghscan.l" +#line 570 "slghscan.l" { BEGIN((withsection==1) ? INITIAL:sem); withsection=0; yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 72: YY_RULE_SETUP -#line 568 "slghscan.l" +#line 571 "slghscan.l" { BEGIN(INITIAL); return OP_UNIMPL; } YY_BREAK case 73: YY_RULE_SETUP -#line 569 "slghscan.l" +#line 572 "slghscan.l" { return GLOBALSET_KEY; } YY_BREAK case 74: YY_RULE_SETUP -#line 570 "slghscan.l" +#line 573 "slghscan.l" { return OP_RIGHT; } YY_BREAK case 75: YY_RULE_SETUP -#line 571 "slghscan.l" +#line 574 "slghscan.l" { return OP_LEFT; } YY_BREAK case 76: YY_RULE_SETUP -#line 572 "slghscan.l" +#line 575 "slghscan.l" { return OP_NOTEQUAL; } YY_BREAK case 77: YY_RULE_SETUP -#line 573 "slghscan.l" +#line 576 "slghscan.l" { return OP_LESSEQUAL; } YY_BREAK case 78: YY_RULE_SETUP -#line 574 "slghscan.l" +#line 577 "slghscan.l" { return OP_GREATEQUAL; } YY_BREAK case 79: YY_RULE_SETUP -#line 575 "slghscan.l" +#line 578 "slghscan.l" { return OP_AND; } YY_BREAK case 80: YY_RULE_SETUP -#line 576 "slghscan.l" +#line 579 "slghscan.l" { return OP_OR; } YY_BREAK case 81: YY_RULE_SETUP -#line 577 "slghscan.l" +#line 580 "slghscan.l" { return OP_XOR; } YY_BREAK case 82: YY_RULE_SETUP -#line 578 "slghscan.l" +#line 581 "slghscan.l" { return ELLIPSIS_KEY; } YY_BREAK case 83: YY_RULE_SETUP -#line 579 "slghscan.l" +#line 582 "slghscan.l" { actionon = 1; yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 84: YY_RULE_SETUP -#line 580 "slghscan.l" +#line 583 "slghscan.l" { actionon = 0; yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 85: YY_RULE_SETUP -#line 581 "slghscan.l" +#line 584 "slghscan.l" { yylval.ch = yytext[0]; return (actionon==0) ? yytext[0] : OP_AND; } YY_BREAK case 86: YY_RULE_SETUP -#line 582 "slghscan.l" +#line 585 "slghscan.l" { yylval.ch = yytext[0]; return (actionon==0) ? yytext[0] : OP_OR; } YY_BREAK case 87: YY_RULE_SETUP -#line 583 "slghscan.l" +#line 586 "slghscan.l" { return OP_XOR; } YY_BREAK case 88: YY_RULE_SETUP -#line 584 "slghscan.l" +#line 587 "slghscan.l" { yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 89: YY_RULE_SETUP -#line 585 "slghscan.l" +#line 588 "slghscan.l" YY_BREAK case 90: YY_RULE_SETUP -#line 586 "slghscan.l" +#line 589 "slghscan.l" { return find_symbol(); } YY_BREAK case 91: YY_RULE_SETUP -#line 587 "slghscan.l" +#line 590 "slghscan.l" { return scan_number(yytext,&yylval,true); } YY_BREAK case 92: YY_RULE_SETUP -#line 588 "slghscan.l" +#line 591 "slghscan.l" { return scan_number(yytext,&yylval,true); } YY_BREAK case 93: YY_RULE_SETUP -#line 589 "slghscan.l" +#line 592 "slghscan.l" { return scan_number(yytext,&yylval,true); } YY_BREAK case 94: YY_RULE_SETUP -#line 590 "slghscan.l" +#line 593 "slghscan.l" YY_BREAK case 95: /* rule 95 can match eol */ YY_RULE_SETUP -#line 591 "slghscan.l" +#line 594 "slghscan.l" { slgh->nextLine(); } YY_BREAK case 96: YY_RULE_SETUP -#line 592 "slghscan.l" +#line 595 "slghscan.l" { return yytext[0]; } YY_BREAK case 97: /* rule 97 can match eol */ YY_RULE_SETUP -#line 594 "slghscan.l" +#line 597 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(sem,preproc) ); } YY_BREAK case 98: YY_RULE_SETUP -#line 595 "slghscan.l" +#line 598 "slghscan.l" { preproc_macroexpand(); } YY_BREAK case 99: YY_RULE_SETUP -#line 596 "slghscan.l" +#line 599 "slghscan.l" { BEGIN(INITIAL); yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 100: YY_RULE_SETUP -#line 597 "slghscan.l" +#line 600 "slghscan.l" { return OP_BOOL_OR; } YY_BREAK case 101: YY_RULE_SETUP -#line 598 "slghscan.l" +#line 601 "slghscan.l" { return OP_BOOL_AND; } YY_BREAK case 102: YY_RULE_SETUP -#line 599 "slghscan.l" +#line 602 "slghscan.l" { return OP_BOOL_XOR; } YY_BREAK case 103: YY_RULE_SETUP -#line 600 "slghscan.l" +#line 603 "slghscan.l" { return OP_RIGHT; } YY_BREAK case 104: YY_RULE_SETUP -#line 601 "slghscan.l" +#line 604 "slghscan.l" { return OP_LEFT; } YY_BREAK case 105: YY_RULE_SETUP -#line 602 "slghscan.l" +#line 605 "slghscan.l" { return OP_EQUAL; } YY_BREAK case 106: YY_RULE_SETUP -#line 603 "slghscan.l" +#line 606 "slghscan.l" { return OP_NOTEQUAL; } YY_BREAK case 107: YY_RULE_SETUP -#line 604 "slghscan.l" +#line 607 "slghscan.l" { return OP_LESSEQUAL; } YY_BREAK case 108: YY_RULE_SETUP -#line 605 "slghscan.l" +#line 608 "slghscan.l" { return OP_GREATEQUAL; } YY_BREAK case 109: YY_RULE_SETUP -#line 606 "slghscan.l" +#line 609 "slghscan.l" { return OP_SDIV; } YY_BREAK case 110: YY_RULE_SETUP -#line 607 "slghscan.l" +#line 610 "slghscan.l" { return OP_SREM; } YY_BREAK case 111: YY_RULE_SETUP -#line 608 "slghscan.l" +#line 611 "slghscan.l" { return OP_SRIGHT; } YY_BREAK case 112: YY_RULE_SETUP -#line 609 "slghscan.l" +#line 612 "slghscan.l" { return OP_SLESS; } YY_BREAK case 113: YY_RULE_SETUP -#line 610 "slghscan.l" +#line 613 "slghscan.l" { return OP_SGREAT; } YY_BREAK case 114: YY_RULE_SETUP -#line 611 "slghscan.l" +#line 614 "slghscan.l" { return OP_SLESSEQUAL; } YY_BREAK case 115: YY_RULE_SETUP -#line 612 "slghscan.l" +#line 615 "slghscan.l" { return OP_SGREATEQUAL; } YY_BREAK case 116: YY_RULE_SETUP -#line 613 "slghscan.l" +#line 616 "slghscan.l" { return OP_FADD; } YY_BREAK case 117: YY_RULE_SETUP -#line 614 "slghscan.l" +#line 617 "slghscan.l" { return OP_FSUB; } YY_BREAK case 118: YY_RULE_SETUP -#line 615 "slghscan.l" +#line 618 "slghscan.l" { return OP_FMULT; } YY_BREAK case 119: YY_RULE_SETUP -#line 616 "slghscan.l" +#line 619 "slghscan.l" { return OP_FDIV; } YY_BREAK case 120: YY_RULE_SETUP -#line 617 "slghscan.l" +#line 620 "slghscan.l" { return OP_FEQUAL; } YY_BREAK case 121: YY_RULE_SETUP -#line 618 "slghscan.l" +#line 621 "slghscan.l" { return OP_FNOTEQUAL; } YY_BREAK case 122: YY_RULE_SETUP -#line 619 "slghscan.l" +#line 622 "slghscan.l" { return OP_FLESS; } YY_BREAK case 123: YY_RULE_SETUP -#line 620 "slghscan.l" +#line 623 "slghscan.l" { return OP_FGREAT; } YY_BREAK case 124: YY_RULE_SETUP -#line 621 "slghscan.l" +#line 624 "slghscan.l" { return OP_FLESSEQUAL; } YY_BREAK case 125: YY_RULE_SETUP -#line 622 "slghscan.l" +#line 625 "slghscan.l" { return OP_FGREATEQUAL; } YY_BREAK case 126: YY_RULE_SETUP -#line 623 "slghscan.l" +#line 626 "slghscan.l" { return OP_ZEXT; } YY_BREAK case 127: YY_RULE_SETUP -#line 624 "slghscan.l" +#line 627 "slghscan.l" { return OP_CARRY; } YY_BREAK case 128: YY_RULE_SETUP -#line 625 "slghscan.l" +#line 628 "slghscan.l" { return OP_BORROW; } YY_BREAK case 129: YY_RULE_SETUP -#line 626 "slghscan.l" +#line 629 "slghscan.l" { return OP_SEXT; } YY_BREAK case 130: YY_RULE_SETUP -#line 627 "slghscan.l" +#line 630 "slghscan.l" { return OP_SCARRY; } YY_BREAK case 131: YY_RULE_SETUP -#line 628 "slghscan.l" +#line 631 "slghscan.l" { return OP_SBORROW; } YY_BREAK case 132: YY_RULE_SETUP -#line 629 "slghscan.l" +#line 632 "slghscan.l" { return OP_NAN; } YY_BREAK case 133: YY_RULE_SETUP -#line 630 "slghscan.l" +#line 633 "slghscan.l" { return OP_ABS; } YY_BREAK case 134: YY_RULE_SETUP -#line 631 "slghscan.l" +#line 634 "slghscan.l" { return OP_SQRT; } YY_BREAK case 135: YY_RULE_SETUP -#line 632 "slghscan.l" +#line 635 "slghscan.l" { return OP_CEIL; } YY_BREAK case 136: YY_RULE_SETUP -#line 633 "slghscan.l" +#line 636 "slghscan.l" { return OP_FLOOR; } YY_BREAK case 137: YY_RULE_SETUP -#line 634 "slghscan.l" +#line 637 "slghscan.l" { return OP_ROUND; } YY_BREAK case 138: YY_RULE_SETUP -#line 635 "slghscan.l" +#line 638 "slghscan.l" { return OP_INT2FLOAT; } YY_BREAK case 139: YY_RULE_SETUP -#line 636 "slghscan.l" +#line 639 "slghscan.l" { return OP_FLOAT2FLOAT; } YY_BREAK case 140: YY_RULE_SETUP -#line 637 "slghscan.l" +#line 640 "slghscan.l" { return OP_TRUNC; } YY_BREAK case 141: YY_RULE_SETUP -#line 638 "slghscan.l" +#line 641 "slghscan.l" { return OP_CPOOLREF; } YY_BREAK case 142: YY_RULE_SETUP -#line 639 "slghscan.l" +#line 642 "slghscan.l" { return OP_NEW; } YY_BREAK case 143: YY_RULE_SETUP -#line 640 "slghscan.l" +#line 643 "slghscan.l" { return OP_POPCOUNT; } YY_BREAK case 144: YY_RULE_SETUP -#line 641 "slghscan.l" +#line 644 "slghscan.l" { return IF_KEY; } YY_BREAK case 145: YY_RULE_SETUP -#line 642 "slghscan.l" +#line 645 "slghscan.l" { return GOTO_KEY; } YY_BREAK case 146: YY_RULE_SETUP -#line 643 "slghscan.l" +#line 646 "slghscan.l" { return CALL_KEY; } YY_BREAK case 147: YY_RULE_SETUP -#line 644 "slghscan.l" +#line 647 "slghscan.l" { return RETURN_KEY; } YY_BREAK case 148: YY_RULE_SETUP -#line 645 "slghscan.l" +#line 648 "slghscan.l" { return DELAYSLOT_KEY; } YY_BREAK case 149: YY_RULE_SETUP -#line 646 "slghscan.l" +#line 649 "slghscan.l" { return CROSSBUILD_KEY; } YY_BREAK case 150: YY_RULE_SETUP -#line 647 "slghscan.l" +#line 650 "slghscan.l" { return EXPORT_KEY; } YY_BREAK case 151: YY_RULE_SETUP -#line 648 "slghscan.l" +#line 651 "slghscan.l" { return BUILD_KEY; } YY_BREAK case 152: YY_RULE_SETUP -#line 649 "slghscan.l" +#line 652 "slghscan.l" { return LOCAL_KEY; } YY_BREAK case 153: YY_RULE_SETUP -#line 650 "slghscan.l" +#line 653 "slghscan.l" { yylval.ch = yytext[0]; return yytext[0]; } YY_BREAK case 154: YY_RULE_SETUP -#line 651 "slghscan.l" +#line 654 "slghscan.l" YY_BREAK case 155: YY_RULE_SETUP -#line 652 "slghscan.l" +#line 655 "slghscan.l" { return find_symbol(); } YY_BREAK case 156: YY_RULE_SETUP -#line 653 "slghscan.l" +#line 656 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 157: YY_RULE_SETUP -#line 654 "slghscan.l" +#line 657 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 158: YY_RULE_SETUP -#line 655 "slghscan.l" +#line 658 "slghscan.l" { return scan_number(yytext,&yylval,false); } YY_BREAK case 159: YY_RULE_SETUP -#line 656 "slghscan.l" +#line 659 "slghscan.l" YY_BREAK case 160: /* rule 160 can match eol */ YY_RULE_SETUP -#line 657 "slghscan.l" +#line 660 "slghscan.l" { slgh->nextLine(); } YY_BREAK case 161: YY_RULE_SETUP -#line 658 "slghscan.l" +#line 661 "slghscan.l" { return yytext[0]; } YY_BREAK case 162: /* rule 162 can match eol */ YY_RULE_SETUP -#line 660 "slghscan.l" +#line 663 "slghscan.l" { slgh->nextLine(); BEGIN( preprocess(preproc,preproc) ); } YY_BREAK case 163: /* rule 163 can match eol */ YY_RULE_SETUP -#line 661 "slghscan.l" +#line 664 "slghscan.l" { slgh->nextLine(); } YY_BREAK case YY_STATE_EOF(INITIAL): @@ -2467,11 +2473,11 @@ case YY_STATE_EOF(print): case YY_STATE_EOF(pattern): case YY_STATE_EOF(sem): case YY_STATE_EOF(preproc): -#line 663 "slghscan.l" -{ yy_delete_buffer( YY_CURRENT_BUFFER ); +#line 666 "slghscan.l" +{ yy_delete_buffer(YY_CURRENT_BUFFER ); if (filebuffers.empty()) yyterminate(); - yy_switch_to_buffer( filebuffers.back().lastbuffer ); + yy_switch_to_buffer(filebuffers.back().lastbuffer ); FILE *curfile = filebuffers.back().file; if (curfile != (FILE *)0) fclose(curfile); @@ -2481,10 +2487,10 @@ case YY_STATE_EOF(preproc): YY_BREAK case 164: YY_RULE_SETUP -#line 673 "slghscan.l" +#line 676 "slghscan.l" ECHO; YY_BREAK -#line 2473 "slghscan.cc" +#line 2479 "slghscan.cc" case YY_END_OF_BUFFER: { @@ -2560,7 +2566,7 @@ ECHO; { (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap( ) ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -2613,7 +2619,6 @@ ECHO; "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -2625,9 +2630,9 @@ ECHO; */ static int yy_get_next_buffer (void) { - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = (yytext_ptr); - int number_to_move, i; + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -2656,7 +2661,7 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -2669,7 +2674,7 @@ static int yy_get_next_buffer (void) else { - int num_to_read = + yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) @@ -2683,7 +2688,7 @@ static int yy_get_next_buffer (void) if ( b->yy_is_our_buffer ) { - int new_size = b->yy_buf_size * 2; + yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -2692,12 +2697,11 @@ static int yy_get_next_buffer (void) b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) ); + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; + b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -2725,7 +2729,7 @@ static int yy_get_next_buffer (void) if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); + yyrestart(yyin ); } else @@ -2739,15 +2743,12 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ - int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; @@ -2763,15 +2764,15 @@ static int yy_get_next_buffer (void) static yy_state_type yy_get_previous_state (void) { - yy_state_type yy_current_state; - char *yy_cp; + register yy_state_type yy_current_state; + register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -2781,9 +2782,9 @@ static int yy_get_next_buffer (void) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 527 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; @@ -2796,10 +2797,10 @@ static int yy_get_next_buffer (void) */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - int yy_is_jam; - char *yy_cp = (yy_c_buf_p); + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); - YY_CHAR yy_c = 1; + register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -2809,19 +2810,17 @@ static int yy_get_next_buffer (void) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 527 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 526); return yy_is_jam ? 0 : yy_current_state; } -#ifndef YY_NO_UNPUT - - static void yyunput (int c, char * yy_bp ) + static void yyunput (int c, register char * yy_bp ) { - char *yy_cp; + register char *yy_cp; yy_cp = (yy_c_buf_p); @@ -2831,10 +2830,10 @@ static int yy_get_next_buffer (void) if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - int number_to_move = (yy_n_chars) + 2; - char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + register yy_size_t number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - char *source = + register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) @@ -2843,7 +2842,7 @@ static int yy_get_next_buffer (void) yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); @@ -2856,8 +2855,6 @@ static int yy_get_next_buffer (void) (yy_c_buf_p) = yy_cp; } -#endif - #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) @@ -2882,7 +2879,7 @@ static int yy_get_next_buffer (void) else { /* need more input */ - int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) @@ -2899,14 +2896,14 @@ static int yy_get_next_buffer (void) */ /* Reset buffer status. */ - yyrestart( yyin ); + yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( ) ) - return 0; + if ( yywrap( ) ) + return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; @@ -2945,11 +2942,11 @@ static int yy_get_next_buffer (void) if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE ); + yy_create_buffer(yyin,YY_BUF_SIZE ); } - yy_init_buffer( YY_CURRENT_BUFFER, input_file ); - yy_load_buffer_state( ); + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); } /** Switch to a different input buffer. @@ -2977,7 +2974,7 @@ static int yy_get_next_buffer (void) } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -3005,7 +3002,7 @@ static void yy_load_buffer_state (void) { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -3014,13 +3011,13 @@ static void yy_load_buffer_state (void) /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer( b, file ); + yy_init_buffer(b,file ); return b; } @@ -3039,9 +3036,9 @@ static void yy_load_buffer_state (void) YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf ); + yyfree((void *) b->yy_ch_buf ); - yyfree( (void *) b ); + yyfree((void *) b ); } /* Initializes or reinitializes a buffer. @@ -3053,7 +3050,7 @@ static void yy_load_buffer_state (void) { int oerrno = errno; - yy_flush_buffer( b ); + yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; @@ -3096,7 +3093,7 @@ static void yy_load_buffer_state (void) b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); + yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes @@ -3127,7 +3124,7 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } @@ -3146,7 +3143,7 @@ void yypop_buffer_state (void) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } @@ -3164,15 +3161,15 @@ static void yyensure_buffer_stack (void) * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -3181,7 +3178,7 @@ static void yyensure_buffer_stack (void) if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; + int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc @@ -3201,7 +3198,7 @@ static void yyensure_buffer_stack (void) * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -3211,23 +3208,23 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return NULL; + return 0; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; + b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b ); + yy_switch_to_buffer(b ); return b; } @@ -3240,10 +3237,10 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (const char * yystr ) +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { - return yy_scan_bytes( yystr, (int) strlen(yystr) ); + return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will @@ -3253,7 +3250,7 @@ YY_BUFFER_STATE yy_scan_string (const char * yystr ) * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; @@ -3261,8 +3258,8 @@ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n ); + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -3271,7 +3268,7 @@ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer( buf, n ); + b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -3287,9 +3284,9 @@ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) #define YY_EXIT_FAILURE 2 #endif -static void yynoreturn yy_fatal_error (const char* msg ) +static void yy_fatal_error (yyconst char* msg ) { - fprintf( stderr, "%s\n", msg ); + (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } @@ -3317,7 +3314,7 @@ static void yynoreturn yy_fatal_error (const char* msg ) */ int yyget_lineno (void) { - + return yylineno; } @@ -3340,7 +3337,7 @@ FILE *yyget_out (void) /** Get the length of the current token. * */ -int yyget_leng (void) +yy_size_t yyget_leng (void) { return yyleng; } @@ -3355,29 +3352,29 @@ char *yyget_text (void) } /** Set the current line number. - * @param _line_number line number + * @param line_number * */ -void yyset_lineno (int _line_number ) +void yyset_lineno (int line_number ) { - yylineno = _line_number; + yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. - * @param _in_str A readable stream. + * @param in_str A readable stream. * * @see yy_switch_to_buffer */ -void yyset_in (FILE * _in_str ) +void yyset_in (FILE * in_str ) { - yyin = _in_str ; + yyin = in_str ; } -void yyset_out (FILE * _out_str ) +void yyset_out (FILE * out_str ) { - yyout = _out_str ; + yyout = out_str ; } int yyget_debug (void) @@ -3385,9 +3382,9 @@ int yyget_debug (void) return yy_flex_debug; } -void yyset_debug (int _bdebug ) +void yyset_debug (int bdebug ) { - yy_flex_debug = _bdebug ; + yy_flex_debug = bdebug ; } static int yy_init_globals (void) @@ -3396,10 +3393,10 @@ static int yy_init_globals (void) * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = NULL; + (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = NULL; + (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; @@ -3408,8 +3405,8 @@ static int yy_init_globals (void) yyin = stdin; yyout = stdout; #else - yyin = NULL; - yyout = NULL; + yyin = (FILE *) 0; + yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by @@ -3424,7 +3421,7 @@ int yylex_destroy (void) /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } @@ -3445,19 +3442,18 @@ int yylex_destroy (void) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n ) +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { - - int i; + register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s ) +static int yy_flex_strlen (yyconst char * s ) { - int n; + register int n; for ( n = 0; s[n]; ++n ) ; @@ -3467,12 +3463,11 @@ static int yy_flex_strlen (const char * s ) void *yyalloc (yy_size_t size ) { - return malloc(size); + return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { - /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -3480,14 +3475,14 @@ void *yyrealloc (void * ptr, yy_size_t size ) * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return realloc(ptr, size); + return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" -#line 673 "slghscan.l" +#line 676 "slghscan.l" diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.l b/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.l index 35210a9c0d..2df137019f 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.l +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghscan.l @@ -429,6 +429,9 @@ int4 find_symbol(void) { case SleighSymbol::end_symbol: yylval.endsym = (EndSymbol *)sym; return ENDSYM; + case SleighSymbol::next2_symbol: + yylval.next2sym = (Next2Symbol *)sym; + return NEXT2SYM; case SleighSymbol::subtable_symbol: yylval.subtablesym = (SubtableSymbol *)sym; return SUBTABLESYM; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.cc index 5f4a8fe323..dbb8f9e51c 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.cc @@ -252,6 +252,8 @@ void SymbolTable::restoreSymbolHeader(const Element *el) sym = new StartSymbol(); else if (el->getName() == "end_sym_head") sym = new EndSymbol(); + else if (el->getName() == "next2_sym_head") + sym = new Next2Symbol(); else if (el->getName() == "subtable_sym_head") sym = new SubtableSymbol(); else if (el->getName() == "flowdest_sym_head") @@ -1254,6 +1256,70 @@ void EndSymbol::restoreXml(const Element *el,SleighBase *trans) patexp->layClaim(); } +Next2Symbol::Next2Symbol(const string &nm,AddrSpace *cspc) : SpecificSymbol(nm) + +{ + const_space = cspc; + patexp = new Next2InstructionValue(); + patexp->layClaim(); +} + +Next2Symbol::~Next2Symbol(void) + +{ + if (patexp != (PatternExpression *)0) + PatternExpression::release(patexp); +} + +VarnodeTpl *Next2Symbol::getVarnode(void) const + +{ // Return instruction offset after next instruction offset as a constant + ConstTpl spc(const_space); + ConstTpl off(ConstTpl::j_next2); + ConstTpl sz_zero; + return new VarnodeTpl(spc,off,sz_zero); +} + +void Next2Symbol::getFixedHandle(FixedHandle &hand,ParserWalker &walker) const + +{ + hand.space = walker.getCurSpace(); + hand.offset_space = (AddrSpace *)0; + hand.offset_offset = walker.getN2addr().getOffset(); // Get instruction address after next instruction + hand.size = hand.space->getAddrSize(); +} + +void Next2Symbol::print(ostream &s,ParserWalker &walker) const + +{ + intb val = (intb) walker.getN2addr().getOffset(); + s << "0x" << hex << val; +} + +void Next2Symbol::saveXml(ostream &s) const + +{ + s << "\n"; +} + +void Next2Symbol::saveXmlHeader(ostream &s) const + +{ + s << "\n"; +} + +void Next2Symbol::restoreXml(const Element *el,SleighBase *trans) + +{ + const_space = trans->getConstantSpace(); + patexp = new Next2InstructionValue(); + patexp->layClaim(); +} + FlowDestSymbol::FlowDestSymbol(const string &nm,AddrSpace *cspc) : SpecificSymbol(nm) { diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.hh index 11aafca1be..82d95ffeff 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slghsymbol.hh @@ -25,7 +25,7 @@ class SleighSymbol { public: enum symbol_type { space_symbol, token_symbol, userop_symbol, value_symbol, valuemap_symbol, name_symbol, varnode_symbol, varnodelist_symbol, operand_symbol, - start_symbol, end_symbol, subtable_symbol, macro_symbol, section_symbol, + start_symbol, end_symbol, next2_symbol, subtable_symbol, macro_symbol, section_symbol, bitrange_symbol, context_symbol, epsilon_symbol, label_symbol, dummy_symbol }; private: @@ -391,6 +391,23 @@ public: virtual void restoreXml(const Element *el,SleighBase *trans); }; +class Next2Symbol : public SpecificSymbol { + AddrSpace *const_space; + PatternExpression *patexp; +public: + Next2Symbol(void) { patexp = (PatternExpression *)0; } // For use with restoreXml + Next2Symbol(const string &nm,AddrSpace *cspc); + virtual ~Next2Symbol(void); + virtual VarnodeTpl *getVarnode(void) const; + virtual PatternExpression *getPatternExpression(void) const { return patexp; } + virtual void getFixedHandle(FixedHandle &hand,ParserWalker &walker) const; + virtual void print(ostream &s,ParserWalker &walker) const; + virtual symbol_type getType(void) const { return next2_symbol; } + virtual void saveXml(ostream &s) const; + virtual void saveXmlHeader(ostream &s) const; + virtual void restoreXml(const Element *el,SleighBase *trans); +}; + class FlowDestSymbol : public SpecificSymbol { AddrSpace *const_space; public: diff --git a/Ghidra/Features/Decompiler/src/decompile/datatests/skipnext2.xml b/Ghidra/Features/Decompiler/src/decompile/datatests/skipnext2.xml new file mode 100644 index 0000000000..e152c1e642 --- /dev/null +++ b/Ghidra/Features/Decompiler/src/decompile/datatests/skipnext2.xml @@ -0,0 +1,19 @@ + + + + +0a0acec58000c0abdfcaf400 + + + + +if \(param_1 != 5\) +iVar1 = param_2 \+ 10; + diff --git a/Ghidra/Features/Decompiler/src/main/doc/cspec.xml b/Ghidra/Features/Decompiler/src/main/doc/cspec.xml index 76c071fa53..98af480794 100644 --- a/Ghidra/Features/Decompiler/src/main/doc/cspec.xml +++ b/Ghidra/Features/Decompiler/src/main/doc/cspec.xml @@ -506,8 +506,8 @@ parameters in the actual p-code operation, or an exception will be thrown during As with a <callfixup>, the <body> tag is fed straight to the SLEIGH semantic parser. It can refer to registers via their symbolic name defined in SLEIGH, it can refer to the operator parameters via their <input> or <output> names, and it can also refer to -inst_start and inst_next as addresses describing the instruction containing the -CALLOTHER. +inst_start, inst_next and inst_next2 as addresses describing the instruction +containing the CALLOTHER. diff --git a/Ghidra/Features/Decompiler/src/main/doc/pcoderef.xml b/Ghidra/Features/Decompiler/src/main/doc/pcoderef.xml index 4921d8d051..52cd43a88b 100644 --- a/Ghidra/Features/Decompiler/src/main/doc/pcoderef.xml +++ b/Ghidra/Features/Decompiler/src/main/doc/pcoderef.xml @@ -1,5 +1,5 @@ -
+
P-Code Reference Manual Last updated September 5, 2019 @@ -184,7 +184,7 @@ longer match their raw p-code form. The core concepts of p-code are: - + Address Space The address space for p-code is a generalization @@ -224,7 +224,7 @@ right byte offset when dereferencing the pointer. The wordsize attribute has no any of the other p-code operations. - + Varnode A varnode is a generalization of @@ -270,7 +270,7 @@ of the constant. As with other varnodes, constants only have a type forced on them by the p-code operations that use them. - + P-code Operation A p-code operation is the analog of a diff --git a/Ghidra/Features/Decompiler/src/main/doc/sleigh.xml b/Ghidra/Features/Decompiler/src/main/doc/sleigh.xml index c60683a52f..e9fc067f91 100644 --- a/Ghidra/Features/Decompiler/src/main/doc/sleigh.xml +++ b/Ghidra/Features/Decompiler/src/main/doc/sleigh.xml @@ -1,12 +1,12 @@ -
+
SLEIGH A Language for Rapid Processor Specification Originally published December 16, 2005 - Last updated October 28, 2020 + Last updated August 24, 2022 - + History @@ -36,7 +36,7 @@ - + Overview @@ -70,7 +70,7 @@ will always refer to this target of the specification. Italics are used when defining terms and for named entities. Bold is used for SLEIGH keywords. - + Introduction to P-Code Although p-code is a distinct language from SLEIGH, because a major @@ -128,7 +128,7 @@ the operation. These are generalizations of the computing concepts of RAM, registers, and machine instructions respectively. - + Address Spaces An address space for p-code is a generalization of @@ -227,7 +227,7 @@ different way. Any consistent meaning assigned to a particular varnode must be provided and enforced by the specification designer. - + Operations P-code is intended to emulate a target processor by substituting a @@ -331,7 +331,7 @@ follow a specific format as parsed by the SLEIGH compiler. In this section, we list the basic formatting rules for this file as enforced by the compiler. - + Comments Comments start with the ‘#’ character and continue to the end of the @@ -340,7 +340,7 @@ constructor (see ) where the ‘#’ cha interpreted as something that should be printed in disassembly. - + Identifiers Identifiers are made up of letters a-z, capitals A-Z, digits 0-9 and @@ -348,7 +348,7 @@ the characters ‘.’ and ‘_’. An identifier can use these characters in any order and for any length, but it must not start with a digit. - + Strings String literals can be used, when specifying names and when specifying @@ -358,7 +358,7 @@ character ‘�’ and all characters in between lose their special meaning. - + Integers Integers are specified either in a decimal format or in a standard @@ -383,7 +383,7 @@ be thought of as having arbitrary precision. Currently, SLEIGH stores integers internally with 64 bits of precision. - + White Space White space characters include space, tab, line-feed, vertical @@ -419,7 +419,7 @@ included files can have their own @include directives. - + Preprocessor Macros SLEIGH allows simple (unparameterized) macro definitions and @@ -449,7 +449,7 @@ definition of a macro from that point on in the file. - + Conditional Compilation SLEIGH supports several directives that allow conditional inclusion of @@ -466,7 +466,7 @@ second @if... @endif@if and @endif. - + @ifdef and @ifndef The @ifdef directive is followed by a @@ -491,7 +491,7 @@ an @if or @elif directive (See below). - + @if The @if directive is followed by a @@ -519,7 +519,7 @@ is defined. - + @else and @elif An @else directive splits the lines @@ -583,7 +583,7 @@ endianess when labeling instruction fields and when defining overlapping registe otherwise the specification language hides endianess issues. - + Alignment Definition An alignment definition looks like @@ -599,7 +599,7 @@ the address against this value and can opt to flag an unaligned instruction as an error. - + Space Definitions The definition of an address space looks like @@ -752,7 +752,7 @@ define register offset=0 size=1 - + Bit Range Registers Many processors define registers that either consist of a single bit @@ -822,7 +822,7 @@ the define bitrange statement can be used as an alternate syntax for defining overlapping registers. - + User-Defined Operations The specification designer can define new p-code operations using @@ -933,7 +933,7 @@ can be used in the definition of other table symbols until the root symbol is fully described. The root symbol has the predefined identifier instruction. - + Notes on Namespaces Almost all identifiers live in the same global "scope". The global scope includes @@ -1006,6 +1006,10 @@ We list all of the symbols that are predefined by SLEIGH. inst_next Offset of the address of the next instruction. + + inst_next2 + Offset of the address of the instruction after the next instruction. + epsilon A special identifier indicating an empty bit pattern. @@ -1019,7 +1023,8 @@ and inst_next. These are family symbols which map in the context of particular instruction to the integer offset of either the address of the instruction or the address of the next instruction respectively. These are used in any relative branching -situation. The other symbols are rarely +situation. The inst_next2 is intended for conditional +skip instruction situations. The remaining symbols are rarely used. The const and unique identifiers are address spaces. The epsilon identifier is inherited from SLED and is a specific symbol equivalent @@ -1088,7 +1093,7 @@ manner of repeats and overlaps in the fields so long as they all have different names. - + Fields as Family Symbols Fields are the most basic form of family symbol; they define a natural @@ -1112,7 +1117,7 @@ representation. The default is hexadecimal. [Currently the dec attribute is not supported] - + Attaching Alternate Meanings to Fields The default interpretation of a field is probably the most natural but @@ -1122,7 +1127,7 @@ is used to alter either the display or semantic meaning of fields into the most common (and basic) interpretations. More complex interpretations must be built up out of tables. - + Attaching Registers Probably the most common processor interpretation @@ -1160,7 +1165,7 @@ display meaning. Instead this encoding is flagged as an invalid form of the instruction. - + Attaching Other Integers Sometimes a processor interprets a field as an integer but not the @@ -1181,7 +1186,7 @@ the fieldlist. [Currently SLEIGH does not support unspecified positions in the list using a ‘_’] - + Attaching Names It is possible to just modify the display characteristics of a field @@ -1293,7 +1298,7 @@ associated with it. Most of this chapter is devoted to describing how to define a single constructor. The issues involved in combining multiple constructors into a single table are addressed in . - + The Five Sections of a Constructor A single complex statement in the specification file describes a @@ -1324,7 +1329,7 @@ the syntax typically fits on a single line. We describe each section in turn. - + The Table Header Every constructor must be part of a table, which is the element with @@ -1459,7 +1464,7 @@ assure uniqueness, but for reverse engineering applications there is no such requirement. - + The '^' character The ‘^’ character in the display section is used to separate @@ -1505,7 +1510,7 @@ constructor’s pattern, the subset of possible instruction encodings that the designer wants to match the constructor being defined. - + Constraints The patterns required for processor specifications can almost always @@ -1562,7 +1567,7 @@ all possible. The logical or operator usually requires two or more mask/value style checks to correctly implement. - + Defining Operands and Invoking Subtables The principle way of defining a constructor operand, left undefined @@ -1622,7 +1627,7 @@ grammar’s start symbol. So this link from local to global is simply a statement of the grouping of old symbols into the new constructor. - + Variable Length Instructions There are some additional complexities to designing a specification @@ -1644,7 +1649,7 @@ final length of the instruction. SLEIGH has two operators that are specific to variable length instruction sets and that give the designer control over how tokens fit together. - + The ';' Operator The most important operator for patterns defining variable length @@ -1705,7 +1710,7 @@ order. Also these operators have higher precedence than the ‘;’ operator, so parentheses may be necessary to get the intended meaning. - + The '...' Operator The ellipsis operator ‘...’ is used to satisfy the token matching @@ -1779,7 +1784,7 @@ you need to break up the parsing of an instruction along lines that don’t quite match the assembly. - + Empty Patterns Occasionally there is a need for an empty pattern when building @@ -1788,7 +1793,7 @@ symbol epsilon which has been traditionally used to indicate an empty pattern. - + Advanced Constraints A constraint does not have to be of the form “field = constant�, @@ -2152,7 +2157,7 @@ operation, INT_ADD, where the input varnodes are r1 and r2 and the output varnode is r1. - + Expressions Expressions are built out of symbols and the binary and unary @@ -2166,7 +2171,7 @@ have a precedence, which is used by the SLEIGH compiler to determine the ordering of the final p-code operations. Parentheses can be used within expressions to affect this order. - + Arithmetic, Logical and Boolean Operators For the most part these operators should be familiar to software @@ -2227,7 +2232,7 @@ address if the wordsize attribute is set to something other than one. - + Extension Most processors have instructions that extend small values into big @@ -2248,7 +2253,7 @@ the INT_SEXT operation is invoked with the sext operator. - + Truncation There are two forms of syntax indicating a truncation of the input @@ -2372,7 +2377,7 @@ the offset portion of the address, and to copy the desired value, the ‘*’ operator must have a register space override. - + Managed Code Operations SLEIGH provides basic support for instructions where encoding and context @@ -2432,7 +2437,7 @@ define pcodeop arctan; - + Statements We describe the types of semantic statements that are allowed in SLEIGH. @@ -2501,7 +2506,7 @@ Use of the local keyword is preferred and may be enforced in future compiler versions. - + Storage Statements SLEIGH supports fairly standard storage statement @@ -2531,7 +2536,7 @@ not a byte address if the wordsize attribute is set to something other than one. - + Exports The semantic section doesn’t just specify how to generate p-code for a @@ -2582,7 +2587,7 @@ would in a normal expression (see varnode being modified to be exported as an integer constant. - + Dynamic References The only other operator allowed as part of @@ -2640,7 +2645,7 @@ addressing mode implementations from instruction semantics at higher levels. - + Branching Statements This section discusses statements that generate p-code branching @@ -2868,6 +2873,26 @@ the BRANCH, CBRANCH, or CALL operation. + +Skip Instruction Branching + +Many processors have a conditional-skip-instruction which must branch over the next instruction +based upon some condition. The inst_next2 symbol has been provided for +this purpose. + + +:skip.eq is opcode=10 { + if (zeroflag!=0) goto inst_next2; +} + + + + +In the example above, the branch address will be determined by adding the parsed-length of the next +instruction to the value of inst_next causing a branch over the next +instruction when the condition is satisfied. + + Bit Range Assignments @@ -2991,7 +3016,7 @@ each followed by a variation which corrects the error. - + Unimplemented Semantics The semantic section must be present for every constructor in the @@ -3148,7 +3173,7 @@ checking, can be used for various tricks in the specification but should generally be avoided. - + Specific Symbol Trees When the SLEIGH parser analyzes an instruction, it starts with the @@ -3234,7 +3259,7 @@ determined by the matching constructor for the op2 table. SLEIGH generates the disassembly and p-code for these encodings by walking the trees. - + Disassembly Trees If the nodes of each tree are replaced with the display information of @@ -3260,7 +3285,7 @@ walking the tree, SLEIGH obtains the final illustrated assembly statements corresponding to the original instruction encodings. - + P-code Trees A similar procedure produces the resulting p-code translation of the @@ -3341,7 +3366,7 @@ calls to other macros. A build directive however should not be used in a macro. - + Build Directives Because the nodes of a specific symbol tree are traversed in a @@ -3395,7 +3420,7 @@ a build directive, followed by the normal action of the instruction. - + Delay Slot Directives For processors with a pipe-lined architecture, multiple instructions @@ -3439,7 +3464,8 @@ by the condition. Because the delayslot directive combines two or more instructions into one, the meaning of the -symbol inst_next becomes ambiguous. It is not +symbols inst_next and inst_next2 +become ambiguous. It is not clear anymore what exactly the “next instruction� is. SLEIGH uses the following conventions for interpreting an inst_next symbol. If it is used in the @@ -3447,7 +3473,12 @@ semantic section, the symbol refers to the address of the instruction after any instructions in the delay slot. However, if it is used in a disassembly action, the inst_next symbol refers to the address of the instruction immediately after the first -instruction, even if there is a delay slot. +instruction, even if there is a delay slot. The use of the +inst_next2 symbol may be inappropriate in conjunction +with delayslot use. While its use of the +next instruction address is identified by inst_next, +the length of the next instruction ignores any delay slots it may have +when computing the value of inst_next2. @@ -3509,7 +3540,7 @@ just another field to use in our bit patterns. It gives us the extra information we need to distinguish between different instructions whose encodings are otherwise the same. - + Basic Use of Context Variables Suppose a processor supports the use of two different sets of @@ -3525,6 +3556,7 @@ define space ram type=ram_space size=4 default; define space register type=register_space size=4; define register offset=0 size=4 [ r0 r1 r2 r3 r4 r5 r6 r7 ]; define register offset=0x100 size=4 [ s0 s1 s2 s3 s4 s5 s6 s7 ]; +define register offset=0x200 size=4 [ statusreg ]; # define context bits (if defined, size must be multiple of 4-bytes) define token instr(16) op=(10,15) rreg1=(7,9) sreg1=(7,9) imm=(0,6) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/antlr/ghidra/sleigh/grammar/SleighCompiler.g b/Ghidra/Framework/SoftwareModeling/src/main/antlr/ghidra/sleigh/grammar/SleighCompiler.g index 45f4069e5f..36418efda9 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/antlr/ghidra/sleigh/grammar/SleighCompiler.g +++ b/Ghidra/Framework/SoftwareModeling/src/main/antlr/ghidra/sleigh/grammar/SleighCompiler.g @@ -349,9 +349,10 @@ specific_symbol[String purpose] returns [SpecificSymbol symbol] : ^(OP_IDENTIFIER s=.) { SleighSymbol sym = pcode.findSymbol($s.getText()); if (sym == null) { - unknownSymbolError($s.getText(), find($s), "start, end, operand, epsilon, or varnode", purpose); + unknownSymbolError($s.getText(), find($s), "start, end, next2, operand, epsilon, or varnode", purpose); } else if(sym.getType() != symbol_type.start_symbol && sym.getType() != symbol_type.end_symbol + && sym.getType() != symbol_type.next2_symbol && sym.getType() != symbol_type.operand_symbol && sym.getType() != symbol_type.epsilon_symbol && sym.getType() != symbol_type.varnode_symbol) { @@ -839,7 +840,7 @@ pattern_symbol[String purpose] returns [PatternExpression expr] : ^(OP_IDENTIFIER s=.) { SleighSymbol sym = sc.findSymbol($s.getText()); if (sym == null) { - unknownSymbolError($s.getText(), find($s), "start, end, operand, epsilon, or varnode", purpose); + unknownSymbolError($s.getText(), find($s), "start, end, next2, operand, epsilon, or varnode", purpose); } else if(sym.getType() == symbol_type.operand_symbol) { OperandSymbol os = (OperandSymbol) sym; if (os.getDefiningSymbol() != null && os.getDefiningSymbol().getType() == symbol_type.subtable_symbol) { @@ -848,6 +849,7 @@ pattern_symbol[String purpose] returns [PatternExpression expr] $expr = os.getPatternExpression(); } else if(sym.getType() == symbol_type.start_symbol || sym.getType() == symbol_type.end_symbol + || sym.getType() == symbol_type.next2_symbol || sym.getType() == symbol_type.epsilon_symbol || sym.getType() == symbol_type.varnode_symbol) { SpecificSymbol ss = (SpecificSymbol) sym; @@ -864,7 +866,7 @@ pattern_symbol[String purpose] returns [PatternExpression expr] reportError(find($s), "Global symbol '" + sym.getName() + "' is not allowed in action expression"); } } else { - wrongSymbolTypeError(sym, find($s), "start, end, operand, epsilon, or varnode", purpose); + wrongSymbolTypeError(sym, find($s), "start, end, next2, operand, epsilon, or varnode", purpose); } } | t=OP_WILDCARD { @@ -877,9 +879,10 @@ pattern_symbol2[String purpose] returns [PatternExpression expr] : ^(OP_IDENTIFIER s=.) { SleighSymbol sym = sc.findSymbol($s.getText()); if (sym == null) { - unknownSymbolError($s.getText(), find($s), "start, end, operand, epsilon, or varnode", purpose); + unknownSymbolError($s.getText(), find($s), "start, end, next2, operand, epsilon, or varnode", purpose); } else if(sym.getType() == symbol_type.start_symbol || sym.getType() == symbol_type.end_symbol + || sym.getType() == symbol_type.next2_symbol || sym.getType() == symbol_type.operand_symbol || sym.getType() == symbol_type.epsilon_symbol || sym.getType() == symbol_type.varnode_symbol) { @@ -893,7 +896,7 @@ pattern_symbol2[String purpose] returns [PatternExpression expr] FamilySymbol z = (FamilySymbol) sym; $expr = z.getPatternValue(); } else { - wrongSymbolTypeError(sym, find($s), "start, end, operand, epsilon, or varnode", purpose); + wrongSymbolTypeError(sym, find($s), "start, end, next2, operand, epsilon, or varnode", purpose); } } | t=OP_WILDCARD { @@ -922,7 +925,7 @@ cstatement[VectorSTL r] } else if(sym.getType() == symbol_type.context_symbol) { ContextSymbol t = (ContextSymbol) sym; if (!sc.contextMod(r, t, e)) { - reportError(find($id), "Cannot use 'inst_next' to set context variable: '" + t.getName() + "'"); + reportError(find($id), "Cannot use 'inst_next' or 'inst_next2' to set context variable: '" + t.getName() + "'"); } } else if(sym.getType() == symbol_type.operand_symbol) { OperandSymbol t = (OperandSymbol) sym; @@ -950,6 +953,7 @@ cstatement[VectorSTL r] || sym.getType() == symbol_type.varnodelist_symbol || sym.getType() == symbol_type.start_symbol || sym.getType() == symbol_type.end_symbol + || sym.getType() == symbol_type.next2_symbol || sym.getType() == symbol_type.operand_symbol || sym.getType() == symbol_type.epsilon_symbol || sym.getType() == symbol_type.varnode_symbol) { @@ -1176,10 +1180,11 @@ assignment returns [VectorSTL value] $value = pcode.newOutput(find(id), false, e, $id.getText()); } else if(sym.getType() != symbol_type.start_symbol && sym.getType() != symbol_type.end_symbol + && sym.getType() != symbol_type.next2_symbol && sym.getType() != symbol_type.operand_symbol && sym.getType() != symbol_type.epsilon_symbol && sym.getType() != symbol_type.varnode_symbol) { - wrongSymbolTypeError(sym, find(id), "start, end, operand, epsilon, or varnode", "assignment"); + wrongSymbolTypeError(sym, find(id), "start, end, next2, operand, epsilon, or varnode", "assignment"); } else { VarnodeTpl v = ((SpecificSymbol) sym).getVarnode(); e.setOutput(find(t), v); @@ -1309,7 +1314,9 @@ jump_symbol[String purpose] returns [VarnodeTpl value] SleighSymbol sym = pcode.findSymbol($s.getText()); if (sym == null) { unknownSymbolError($s.getText(), find($s), "start, end, or operand", purpose); - } else if(sym.getType() == symbol_type.start_symbol || sym.getType() == symbol_type.end_symbol) { + } else if (sym.getType() == symbol_type.start_symbol || + sym.getType() == symbol_type.end_symbol || + sym.getType() == symbol_type.next2_symbol) { SpecificSymbol ss = (SpecificSymbol) sym; $value = new VarnodeTpl(find($s), new ConstTpl(ConstTpl.const_type.j_curspace), ss.getVarnode().getOffset(), @@ -1489,6 +1496,7 @@ expr_apply returns [Object value] } } else if(sym.getType() == symbol_type.start_symbol || sym.getType() == symbol_type.end_symbol + || sym.getType() == symbol_type.next2_symbol || sym.getType() == symbol_type.operand_symbol || sym.getType() == symbol_type.epsilon_symbol || sym.getType() == symbol_type.varnode_symbol) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/SleighAssemblerBuilder.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/SleighAssemblerBuilder.java index 2c1612ecc4..077b694b14 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/SleighAssemblerBuilder.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/SleighAssemblerBuilder.java @@ -573,6 +573,10 @@ public class SleighAssemblerBuilder implements AssemblerBuilder { else if (sym instanceof EndSymbol) { // Ignore. We handle inst_next in semantic processing } + + else if (sym instanceof Next2Symbol) { + // Ignore. We handle inst_next2 in semantic processing + } else if (sym instanceof UseropSymbol) { // Ignore. We don't do pcode. } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/Next2InstructionValueSolver.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/Next2InstructionValueSolver.java new file mode 100644 index 0000000000..48e2185250 --- /dev/null +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/Next2InstructionValueSolver.java @@ -0,0 +1,77 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.assembler.sleigh.expr; + +import java.util.Map; +import java.util.Set; + +import ghidra.app.plugin.assembler.sleigh.sem.*; +import ghidra.app.plugin.processors.sleigh.expression.EndInstructionValue; + +/** + * "Solves" expressions of {@code inst_next2} + * + *

+ * Works like the constant solver, but takes the value of {@code inst_next}, which is given by the + * assembly address and the resulting instruction length. + * + *

+ * NOTE: This solver requires backfill, since the value of {@code inst_next2} is not known + * until possible prefixes have been considered. + */ +public class Next2InstructionValueSolver extends AbstractExpressionSolver { + + public Next2InstructionValueSolver() { + super(EndInstructionValue.class); + } + + @Override + public AssemblyResolution solve(EndInstructionValue iv, MaskedLong goal, Map vals, + AssemblyResolvedPatterns cur, Set hints, String description) { + throw new AssertionError( + "INTERNAL: Should never be asked to solve for " + AssemblyTreeResolver.INST_NEXT2); + } + + @Override + public MaskedLong getValue(EndInstructionValue iv, Map vals, + AssemblyResolvedPatterns cur) throws NeedsBackfillException { + Long instNext = vals.get(AssemblyTreeResolver.INST_NEXT2); + if (instNext == null) { + throw new NeedsBackfillException(AssemblyTreeResolver.INST_NEXT2); + } + return MaskedLong.fromLong(instNext); + } + + @Override + public int getInstructionLength(EndInstructionValue iv) { + return 0; + } + + @Override + public MaskedLong valueForResolution(EndInstructionValue exp, Map vals, + AssemblyResolvedPatterns rc) { + Long instNext = vals.get(AssemblyTreeResolver.INST_NEXT2); + if (instNext == null) { + /** + * This method is used in forward state construction, so just leave unknown. This may + * cause unresolvable trees to get generated, but we can't know that until we try to + * resolve them. + */ + return MaskedLong.UNKS; + } + return MaskedLong.fromLong(instNext); + } +} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/RecursiveDescentSolver.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/RecursiveDescentSolver.java index 1f7df75fef..d706cd33ae 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/RecursiveDescentSolver.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/RecursiveDescentSolver.java @@ -53,6 +53,7 @@ public class RecursiveDescentSolver { new ContextFieldSolver().register(this); new DivExpressionSolver().register(this); new EndInstructionValueSolver().register(this); + new Next2InstructionValueSolver().register(this); new LeftShiftExpressionSolver().register(this); new MinusExpressionSolver().register(this); new MultExpressionSolver().register(this); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/match/AbstractExpressionMatcher.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/match/AbstractExpressionMatcher.java index 203e9ffde9..a9f6455bf9 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/match/AbstractExpressionMatcher.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/match/AbstractExpressionMatcher.java @@ -78,6 +78,9 @@ public abstract class AbstractExpressionMatcher if (a instanceof EndInstructionValue) { return true; } + if (a instanceof Next2InstructionValue) { + return true; + } if (a instanceof StartInstructionValue) { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyTreeResolver.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyTreeResolver.java index 6e7e11afd8..a3f0e2ce9a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyTreeResolver.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyTreeResolver.java @@ -54,6 +54,7 @@ public class AssemblyTreeResolver { public static final String INST_START = "inst_start"; public static final String INST_NEXT = "inst_next"; + public static final String INST_NEXT2 = "inst_next2"; protected final SleighLanguage lang; protected final Address at; @@ -195,6 +196,8 @@ public class AssemblyTreeResolver { return rc; } vals.put(INST_NEXT, at.add(rc.getInstructionLength()).getAddressableWordOffset()); + // inst_next2 use not really supported + vals.put(INST_NEXT2, at.add(rc.getInstructionLength()).getAddressableWordOffset()); DBG.println("Backfilling: " + rc); AssemblyResolution ar = rc.backfill(SOLVER, vals); DBG.println("Backfilled final: " + ar); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/ParserWalker.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/ParserWalker.java index a1331c21ca..0f2cc7d104 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/ParserWalker.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/ParserWalker.java @@ -210,6 +210,12 @@ public class ParserWalker { return context.getNaddr(); } + public Address getN2addr() { + if (cross_context != null) + return cross_context.getN2addr(); + return context.getN2addr(); + } + public AddressSpace getCurSpace() { return context.getCurSpace(); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/PcodeEmit.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/PcodeEmit.java index c4a2d26416..05768583f9 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/PcodeEmit.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/PcodeEmit.java @@ -246,7 +246,7 @@ public abstract class PcodeEmit { if (opcode == PcodeOp.BRANCH) { int offsetType = inputs[0].getOffset().getType(); if (offsetType == ConstTpl.J_RELATIVE || offsetType == ConstTpl.J_START || - offsetType == ConstTpl.J_NEXT) { + offsetType == ConstTpl.J_NEXT || offsetType == ConstTpl.J_NEXT2) { return false; } OpTpl callopt = new OpTpl(PcodeOp.CALL, null, inputs); @@ -269,7 +269,7 @@ public abstract class PcodeEmit { else if (opcode == PcodeOp.CBRANCH) { int offsetType = inputs[0].getOffset().getType(); if (offsetType == ConstTpl.J_RELATIVE || offsetType == ConstTpl.J_START || - offsetType == ConstTpl.J_NEXT) { + offsetType == ConstTpl.J_NEXT || offsetType == ConstTpl.J_NEXT2) { return false; } @@ -326,7 +326,7 @@ public abstract class PcodeEmit { if (opcode == PcodeOp.BRANCH || opcode == PcodeOp.CALL) { int offsetType = inputs[0].getOffset().getType(); if (offsetType == ConstTpl.J_RELATIVE || offsetType == ConstTpl.J_START || - offsetType == ConstTpl.J_NEXT) { + offsetType == ConstTpl.J_NEXT || offsetType == ConstTpl.J_NEXT2) { return false; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java index 7ec62bf239..c567c1fa42 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java @@ -89,7 +89,6 @@ public class SleighInstructionPrototype implements InstructionPrototype { private final static Address[] emptyFlow = new Address[0]; private ContextCache contextCache; -// private InstructionContext instructionContextCache; private int length; private ConstructState rootState; private ConstructState mnemonicState; // state for print mnemonic @@ -236,6 +235,9 @@ public class SleighInstructionPrototype implements InstructionPrototype { if (destType == ConstTpl.J_NEXT) { flags = BRANCH_TO_END; } + else if (destType == ConstTpl.J_NEXT2) { + flags = JUMPOUT; + } else if ((destType != ConstTpl.J_START) && (destType != ConstTpl.J_RELATIVE)) { flags = JUMPOUT; } @@ -674,6 +676,9 @@ public class SleighInstructionPrototype implements InstructionPrototype { Address addr = getHandleAddr(hand, parsecontext.getAddr().getAddressSpace()); res.add(addr); } + else if (rec.op.getInput()[0].getOffset().getType() == ConstTpl.J_NEXT2) { + res.add(parsecontext.getN2addr()); + } } } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighParserContext.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighParserContext.java index b4603190a9..6949072495 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighParserContext.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighParserContext.java @@ -21,8 +21,7 @@ import ghidra.app.plugin.processors.sleigh.symbol.OperandSymbol; import ghidra.app.plugin.processors.sleigh.symbol.TripleSymbol; import ghidra.program.model.address.*; import ghidra.program.model.lang.*; -import ghidra.program.model.mem.MemBuffer; -import ghidra.program.model.mem.MemoryAccessException; +import ghidra.program.model.mem.*; /** * @@ -33,8 +32,9 @@ import ghidra.program.model.mem.MemoryAccessException; public class SleighParserContext implements ParserContext { private MemBuffer memBuffer; - private Address addr; // Address of start of instruction - private Address nextInstrAddr; // Address of next instruction + private Address addr; // Address of start of instruction (inst_start) + private Address nextInstrAddr; // Address of next instruction (inst_next) + private Address next2InstAddr; // Address of instruction after next instruction (inst_next2) private Address refAddr; // corresponds to inst_ref for call-fixup use private Address destAddr; // corresponds to inst_dest for call-fixup use private SleighInstructionPrototype prototype; @@ -71,7 +71,8 @@ public class SleighParserContext implements ParserContext { } /** - * Constructor for building precompiled templates + * Constructor for building precompiled templates. + * NOTE: This form does not support use of inst_next2. * @param aAddr = address to which 'inst_start' resolves * @param nAddr = address to which 'inst_next' resolves * @param rAddr = special address associated with original call @@ -172,22 +173,99 @@ public class SleighParserContext implements ParserContext { return handle; } + /** + * get address of current instruction + * @return address of current instruction + */ public Address getAddr() { return addr; } + /** + * Get address of instruction after current instruction. This may return null if this context + * instance does not support use of {@code inst_next} or next address falls beyond end of + * address space. + * @return address of next instruction or null + */ public Address getNaddr() { return nextInstrAddr; } + /** + * Get address of instruction after the next instruction. This may return {@link #getNaddr()} + * if this context instance does not support use of {@code inst_next2} or parse of next + * instruction fails. + * @return address of instruction after the next instruction or null + */ + public Address getN2addr() { + if (next2InstAddr != null) { + return next2InstAddr; + } + next2InstAddr = computeNext2Address(); + if (next2InstAddr == null) { + // unsupported use of inst_next2 or parse failure on next instruction + // returns same as inst_next + next2InstAddr = nextInstrAddr; + } + return next2InstAddr; + } + + /** + * Return the address after the next instruction (inst_next2). The length of next instruction + * based on attempted parse of next instruction and does not consider any delayslot use. + * The current instructions context is used during the parse. + * @return address after the next instruction or null if unable/failed to determine + */ + private Address computeNext2Address() { + if (memBuffer == null || nextInstrAddr == null) { + return null; // not supported without memBuffer for parse + } + try { + Address nextAddr = nextInstrAddr; + Language language = prototype.getLanguage(); + + // limitation: assumes same context as current instruction + ProcessorContextImpl ctx = new ProcessorContextImpl(language); + RegisterValue ctxVal = getContextRegisterValue(); + if (ctxVal != null) { + ctx.setRegisterValue(ctxVal); + } + + int offset = (int) nextAddr.subtract(addr); + MemBuffer nearbymem = new WrappedMemBuffer(memBuffer, offset); + + SleighInstructionPrototype proto = + (SleighInstructionPrototype) language.parse(nearbymem, ctx, true); + + return nextAddr.addNoWrap(proto.getLength()); + } + catch (Exception e) { + // ignore + } + return null; + } + + /** + * Get address space containing current instruction + * @return address space containing current instruction + */ public AddressSpace getCurSpace() { return addr.getAddressSpace(); } + /** + * Get constant address space + * @return constant address space + */ public AddressSpace getConstSpace() { return constantSpace; } + /** + * Get memory buffer for current instruction which may also be used to parse next instruction + * or delay slot instructions. + * @return memory buffer for current instruction + */ public MemBuffer getMemBuffer() { return memBuffer; } @@ -251,6 +329,44 @@ public class SleighParserContext implements ParserContext { return res; } + /** + * Get the processor context value as a RegisterValue + * @return processor context value + */ + public RegisterValue getContextRegisterValue() { + + Register baseContextRegister = prototype.getLanguage().getContextBaseRegister(); + if (baseContextRegister == null) { + return null; + } + + // convert context int words to byte array for RegisterValue use + int ctxByteLen = baseContextRegister.getMinimumByteSize(); + byte[] ctxValueBytes = new byte[ctxByteLen]; + + for (int i = 0; i < context.length; i++) { + int word = context[i]; + for (int n = 3; n >= 0; --n) { + int byteIndex = (i * 4) + n; + setByte(ctxValueBytes, byteIndex, (byte) word); + word >>= 8; + } + } + + // append mask to value array for RegisterValue use + byte[] ctxValueMaskBytes = new byte[2 * ctxByteLen]; + Arrays.fill(ctxValueMaskBytes, 0, ctxByteLen, (byte) 0xff); + System.arraycopy(ctxValueBytes, 0, ctxValueMaskBytes, ctxByteLen, ctxByteLen); + + return new RegisterValue(baseContextRegister, ctxValueMaskBytes); + } + + private void setByte(byte[] bytes, int index, byte b) { + if (index < bytes.length) { + bytes[index] = b; + } + } + /** * Get bytes from context into an int * @param bytestart is the index of the first byte to fetch diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/Next2InstructionValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/Next2InstructionValue.java new file mode 100644 index 0000000000..58608dd6c0 --- /dev/null +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/Next2InstructionValue.java @@ -0,0 +1,68 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.processors.sleigh.expression; + +import ghidra.app.plugin.processors.sleigh.ParserWalker; +import ghidra.app.plugin.processors.sleigh.SleighLanguage; +import ghidra.program.model.address.Address; +import ghidra.program.model.mem.MemoryAccessException; +import ghidra.xml.XmlPullParser; + +/** + * + * + * The integer offset of the address following the current instruction + */ +public class Next2InstructionValue extends PatternValue { + private static final int HASH = "[inst_next2]".hashCode(); + + @Override + public int hashCode() { + return HASH; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof Next2InstructionValue; + } + + @Override + public long minValue() { + return 0; + } + + @Override + public long maxValue() { + return 0; + } + + @Override + public long getValue(ParserWalker walker) throws MemoryAccessException { + Address addr = walker.getN2addr(); + return addr.getAddressableWordOffset(); + } + + @Override + public void restoreXml(XmlPullParser parser, SleighLanguage lang) { + parser.discardSubTree("next2_exp"); + // Nothing to do + } + + @Override + public String toString() { + return "[inst_next2]"; + } +} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/PatternExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/PatternExpression.java index 0d83f08ace..69b6f9c3cb 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/PatternExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/expression/PatternExpression.java @@ -51,6 +51,8 @@ public abstract class PatternExpression { res = new StartInstructionValue(); else if (nm.equals("end_exp")) res = new EndInstructionValue(); + else if (nm.equals("next2_exp")) + res = new Next2InstructionValue(); else if (nm.equals("plus_exp")) res = new PlusExpression(); else if (nm.equals("sub_exp")) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/Next2Symbol.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/Next2Symbol.java new file mode 100644 index 0000000000..5c2660f02c --- /dev/null +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/Next2Symbol.java @@ -0,0 +1,68 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.processors.sleigh.symbol; + +import java.util.ArrayList; + +import ghidra.app.plugin.processors.sleigh.*; +import ghidra.app.plugin.processors.sleigh.expression.Next2InstructionValue; +import ghidra.app.plugin.processors.sleigh.expression.PatternExpression; +import ghidra.program.model.mem.MemoryAccessException; +import ghidra.xml.XmlElement; +import ghidra.xml.XmlPullParser; + +/** + * + * + * Symbol with semantic value equal to offset of address immediately + * after the next instruction (inst_next2) + */ +public class Next2Symbol extends SpecificSymbol { + + private PatternExpression patexp; + + @Override + public PatternExpression getPatternExpression() { + return patexp; + } + + @Override + public void getFixedHandle(FixedHandle hand, ParserWalker walker) { + hand.space = walker.getCurSpace(); + hand.offset_space = null; + hand.offset_offset = walker.getN2addr().getOffset(); + hand.size = hand.space.getPointerSize(); + } + + @Override + public String print(ParserWalker walker) throws MemoryAccessException { + long val = walker.getN2addr().getOffset(); + return "0x"+Long.toHexString(val); + } + + @Override + public void printList(ParserWalker walker, ArrayList list) { + list.add(walker.getParentHandle()); + } + + @Override + public void restoreXml(XmlPullParser parser, SleighLanguage sleigh) { + XmlElement element = parser.start("next2_sym"); + patexp = new Next2InstructionValue(); + parser.end(element); + } + +} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/SymbolTable.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/SymbolTable.java index 1f9c79e61c..dd9cec532c 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/SymbolTable.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/symbol/SymbolTable.java @@ -19,6 +19,8 @@ */ package ghidra.app.plugin.processors.sleigh.symbol; +import java.util.ArrayList; + import ghidra.app.plugin.processors.sleigh.SleighException; import ghidra.app.plugin.processors.sleigh.SleighLanguage; import ghidra.program.model.lang.UnknownInstructionException; @@ -26,8 +28,6 @@ import ghidra.util.xml.SpecXmlUtils; import ghidra.xml.XmlElement; import ghidra.xml.XmlPullParser; -import java.util.ArrayList; - /** * * @@ -152,6 +152,8 @@ public class SymbolTable { sym = new StartSymbol(); else if (el.getName().equals("end_sym_head")) sym = new EndSymbol(); + else if (el.getName().equals("next2_sym_head")) + sym = new Next2Symbol(); else if (el.getName().equals("subtable_sym_head")) sym = new SubtableSymbol(); else diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/template/ConstTpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/template/ConstTpl.java index 3f745f5ef0..1df3ea7096 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/template/ConstTpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/template/ConstTpl.java @@ -39,14 +39,15 @@ public class ConstTpl { public static final int HANDLE = 1; public static final int J_START = 2; public static final int J_NEXT = 3; - public static final int J_CURSPACE = 4; - public static final int J_CURSPACE_SIZE = 5; - public static final int SPACEID = 6; - public static final int J_RELATIVE = 7; - public static final int J_FLOWREF = 8; - public static final int J_FLOWREF_SIZE = 9; - public static final int J_FLOWDEST = 10; - public static final int J_FLOWDEST_SIZE = 11; + public static final int J_NEXT2 = 4; + public static final int J_CURSPACE = 5; + public static final int J_CURSPACE_SIZE = 6; + public static final int SPACEID = 7; + public static final int J_RELATIVE = 8; + public static final int J_FLOWREF = 9; + public static final int J_FLOWREF_SIZE = 10; + public static final int J_FLOWDEST = 11; + public static final int J_FLOWDEST_SIZE = 12; public static final int V_SPACE = 0; public static final int V_OFFSET = 1; @@ -143,6 +144,8 @@ public class ConstTpl { return walker.getAddr().getOffset(); case J_NEXT: return walker.getNaddr().getOffset(); + case J_NEXT2: + return walker.getN2addr().getOffset(); case J_FLOWREF: return walker.getFlowRefAddr().getOffset(); case J_FLOWREF_SIZE: @@ -315,6 +318,9 @@ public class ConstTpl { else if (typestr.equals("next")) { type = J_NEXT; } + else if (typestr.equals("next2")) { + type = J_NEXT2; + } else if (typestr.equals("curspace")) { type = J_CURSPACE; } @@ -379,6 +385,8 @@ public class ConstTpl { return "[flowref_size]"; case J_NEXT: return "[next]"; + case J_NEXT2: + return "[next2]"; case J_START: return "[start]"; case J_RELATIVE: diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserContext.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserContext.java deleted file mode 100644 index b0b5103573..0000000000 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserContext.java +++ /dev/null @@ -1,302 +0,0 @@ -/* ### - * IP: GHIDRA - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ghidra.pcodeCPort.context; - -import generic.stl.IteratorSTL; -import generic.stl.VectorSTL; -import ghidra.app.plugin.processors.sleigh.SleighException; -import ghidra.pcodeCPort.address.Address; -import ghidra.pcodeCPort.globalcontext.ContextCache; -import ghidra.pcodeCPort.slghsymbol.*; -import ghidra.pcodeCPort.space.AddrSpace; -import ghidra.pcodeCPort.translate.BadDataError; - -public class ParserContext { - public enum ContextState { - uninitialized, disassembly, pcode; - } - - private ContextState parsestate; - private AddrSpace const_space; - private byte[] buf = new byte[16]; // Pointer to instruction bit stream - private int[] context; // Pointer to local context - private int contextsize; // Number of entries in context array - private ContextCache contcache; // Interface for getting/setting context - private VectorSTL contextcommit = new VectorSTL(); - private Address addr; // Address of start of instruction - private Address naddr; // Address of next instruction - private VectorSTL state = new VectorSTL(); // Current resolved - // instruction - ConstructState base_state; - private ConstructState point; // Current substate - private boolean outofband; - private int oob_offset; - private int alloc; // Number of ConstructState's allocated - private int delayslot; // delayslot depth - - public void dispose() { - if (context != null) { - context = null; - } - } - - private ConstructState getState(int index) { - ConstructState constructState = state.get(index); - if (constructState == null) { - constructState = new ConstructState(); - state.set(index, constructState); - } - return constructState; - } - - public void setAddr(Address ad) { - addr = ad; - } - - public void setNaddr(Address ad) { - naddr = ad; - } - - public void clearCommits() { - contextcommit.clear(); - } - - public Address getAddr() { - return addr; - } - - public Address getNaddr() { - return naddr; - } - - public AddrSpace getCurSpace() { - return addr.getSpace(); - } - - public AddrSpace getConstSpace() { - return const_space; - } - - public void setContextWord(int i, int val, int mask) { - context[i] = (context[i] & (~mask)) | (mask & val); - } - - public void loadContext() { - contcache.getContext(addr, context); - } - - public int getLength() { - return base_state.length; - } - - public void setDelaySlot(int val) { - delayslot = val; - } - - public int getDelaySlot() { - return delayslot; - } - - public ParserContext(ContextCache ccache) { - parsestate = ContextState.uninitialized; - contcache = ccache; - if (ccache != null) { - contextsize = ccache.getDatabase().getContextSize(); - context = new int[contextsize]; - } - else { - contextsize = 0; - context = null; - } - } - - private void resize(VectorSTL list, int newsize) { - while (list.size() < newsize) { - list.push_back(new ConstructState()); - } - while (list.size() > newsize) { - list.pop_back(); - } - } - - public byte[] getBuffer() { - return buf; - } - - public void initialize(int maxstate, int maxparam, AddrSpace spc) { - const_space = spc; - resize(state, maxstate); - getState(0).parent = null; - for (int i = 0; i < maxstate; ++i) { - resize(getState(i).resolve, maxparam); - } - base_state = getState(0); - } - - public ContextState getParserState() { - return parsestate; - } - - public void setParserState(ContextState st) { - parsestate = st; - } - - public void deallocateState(ParserWalkerChange walker) { - alloc = 1; - walker.context = this; - walker.baseState(); - } - - public void allocateOperand(int i, ParserWalkerChange walker) { - ConstructState opstate = state.get(alloc++); - opstate.parent = walker.point; - opstate.ct = null; - walker.point.resolve.set(i, opstate); - walker.breadcrumb[walker.depth++] += 1; - walker.point = opstate; - walker.breadcrumb[walker.depth] = 0; - } - - public int getInstructionBytes(int bytestart, int size, int off) { - // Get bytes from the instruction stream into an int - // (assuming big endian format) - off += bytestart; - if (off >= 16) { - throw new BadDataError("Instruction is using more than 16 bytes"); - } - int res = 0; - for (int i = 0; i < size; ++i) { - res <<= 8; - res |= buf[i + off]; - } - return res; - } - - public int getInstructionBits(int startbit, int size, int off) { - off += (startbit / 8); - if (off >= 16) { - throw new BadDataError("Instruction is using more than 16 bytes"); - } - startbit = startbit % 8; - int bytesize = (startbit + size - 1) / 8 + 1; - int res = 0; - for (int i = 0; i < bytesize; ++i) { - res <<= 8; - res |= buf[i + off]; - } - res <<= 8 * (4 - bytesize) + startbit; // Move starting bit to highest position - res >>= 8 * 4 - size; // Shift to bottom of intm - return res; - } - - // Get bytes from context into a intm - // Assume request is within a intm - public int getContextBytes(int bytestart, int size) { - int res = context[bytestart / 4]; - res <<= (bytestart % 4) * 8; - res >>>= (4 - size) * 8; - return res; - } - - public int getContextBits(int startbit, int size) { - int res = context[startbit / (8 * 4)]; // Get intm containing highest bit - res <<= (startbit % (8 * 4)); // Shift startbit to highest position - res >>>= (8 * 4 - size); - return res; - } - - // set the offset into instruction bytes (for - // future calls into getInstructionBytes) without - // disturbing the tree walk - public void setOffsetOutOfBand(Constructor c, int index) { - outofband = true; - ConstructState pt = point; - while (pt.ct != c) { - if (pt == getState(0)) { - return; - } - pt = pt.parent; - } - OperandSymbol sym = c.getOperand(index); - int i = sym.getOffsetBase(); - // if i<0, i.e. the offset of the operand is constructor relative - // its possible that the branch corresponding to the operand - // has not been constructed yet. Context expressions are - // evaluated BEFORE the constructors branches are created. - // So we have to construct the offset explicitly. - if (i < 0) { - oob_offset = pt.offset + sym.getRelativeOffset(); - } - else { - oob_offset = pt.resolve.get(index).offset; - } - } - - public void addCommit(TripleSymbol sym, int num, int mask, boolean flow, ConstructState point) { - contextcommit.push_back(new ContextSet()); - ContextSet set = contextcommit.back(); - - set.sym = sym; - set.point = point; // This is the current state - set.num = num; - set.mask = mask; - set.value = context[num] & mask; - set.flow = flow; - } - - public void applyCommits() { - if (contextcommit.empty()) { - return; - } - ParserWalker walker = new ParserWalker(this); - walker.baseState(); - - IteratorSTL iter; - for (iter = contextcommit.begin(); !iter.isEnd(); iter.increment()) { - TripleSymbol sym = iter.get().sym; - Address addr = null; - if (sym.getType() == symbol_type.operand_symbol) { - // The value for an OperandSymbol is probabably already - // calculated, we just need to find the right - // tree node of the state - int i = ((OperandSymbol) sym).getIndex(); - FixedHandle h = (iter.get().point.resolve.get(i).hand); - addr = new Address(h.space, h.offset_offset); - } - else { - FixedHandle hand = new FixedHandle(); - sym.getFixedHandle(hand, walker); - addr = new Address(hand.space, hand.offset_offset); - } - // Commit context change - contcache.setContext(addr, iter.get().num, iter.get().mask, iter.get().value); - } - } - - /** - * Returns primary flow reference destination address for instruction or null - */ - public Address getFlowRefAddr() { - throw new SleighException("Flow reference (inst_ref) is undefined at " + getAddr()); - } - - /** - * Returns original flow destination address for instruction or null - */ - public Address getFlowDestAddr() { - throw new SleighException("Flow destination (inst_dest) is undefined at " + getAddr()); - } -} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalker.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalker.java deleted file mode 100644 index 33b7c103b1..0000000000 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalker.java +++ /dev/null @@ -1,160 +0,0 @@ -/* ### - * IP: GHIDRA - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ghidra.pcodeCPort.context; - -import ghidra.pcodeCPort.address.Address; -import ghidra.pcodeCPort.slghsymbol.Constructor; -import ghidra.pcodeCPort.slghsymbol.OperandSymbol; -import ghidra.pcodeCPort.space.AddrSpace; - -public class ParserWalker { - // A class for walking the ParserContext - private ParserContext const_context; - protected ConstructState point; // The current node being visited - protected int depth; // Depth of the current node - protected int[] breadcrumb; // Path of operands from root - - public ParserWalker(ParserContext c) { - const_context = c; - breadcrumb = new int[32]; - } - - public ParserContext getParserContext() { - return const_context; - } - - public void baseState() { - point = const_context.base_state; - depth = 0; - breadcrumb[0] = 0; - } - - public void setOutOfBandState(Constructor ct, int index, ConstructState tempstate, - ParserWalker otherwalker) { - // Initialize walker for future calls into getInstructionBytes assuming -ct- is the current position in the walk - ConstructState pt = otherwalker.point; - int curdepth = otherwalker.depth; - while (pt.ct != ct) { - if (curdepth <= 0) { - return; - } - curdepth -= 1; - pt = pt.parent; - } - OperandSymbol sym = ct.getOperand(index); - int i = sym.getOffsetBase(); - // if i<0, i.e. the offset of the operand is constructor relative - // its possible that the branch corresponding to the operand - // has not been constructed yet. Context expressions are - // evaluated BEFORE the constructors branches are created. - // So we have to construct the offset explicitly. - if (i < 0) { - tempstate.offset = pt.offset + sym.getRelativeOffset(); - } - else { - tempstate.offset = pt.resolve.get(index).offset; - } - - tempstate.ct = ct; - tempstate.length = pt.length; - point = tempstate; - depth = 0; - breadcrumb[0] = 0; - } - - public boolean isState() { - return (point != null); - } - - public void pushOperand(int i) { - breadcrumb[depth++] = i + 1; - point = point.resolve.get(i); - breadcrumb[depth] = 0; - } - - public void popOperand() { - point = point.parent; - depth -= 1; - } - - public int getOffset(int i) { - if (i < 0) { - return point.offset; - } - ConstructState op = point.resolve.get(i); - return op.offset + op.length; - } - - public Constructor getConstructor() { - return point.ct; - } - - public int getOperand() { - return breadcrumb[depth]; - } - - public FixedHandle getParentHandle() { - return point.hand; - } - - public FixedHandle getFixedHandle(int i) { - return point.resolve.get(i).hand; - } - - public AddrSpace getCurSpace() { - return const_context.getCurSpace(); - } - - public AddrSpace getConstSpace() { - return const_context.getConstSpace(); - } - - public Address getAddr() { - return const_context.getAddr(); - } - - public Address getNaddr() { - return const_context.getNaddr(); - } - - public Address getFlowRefAddr() { - return const_context.getFlowRefAddr(); - } - - public Address getFlowDestAddr() { - return const_context.getFlowDestAddr(); - } - - public int getLength() { - return const_context.getLength(); - } - - public int getInstructionBytes(int byteoff, int numbytes) { - return const_context.getInstructionBytes(byteoff, numbytes, point.offset); - } - - public int getContextBytes(int byteoff, int numbytes) { - return const_context.getContextBytes(byteoff, numbytes); - } - - public int getInstructionBits(int startbit, int size) { - return const_context.getInstructionBits(startbit, size, point.offset); - } - - public int getContextBits(int startbit, int size) { - return const_context.getContextBits(startbit, size); - } -} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalkerChange.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalkerChange.java deleted file mode 100644 index 1dfbae3cd3..0000000000 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/context/ParserWalkerChange.java +++ /dev/null @@ -1,66 +0,0 @@ -/* ### - * IP: GHIDRA - * REVIEWED: YES - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ghidra.pcodeCPort.context; - -import ghidra.pcodeCPort.slghsymbol.Constructor; - -public class ParserWalkerChange extends ParserWalker { - // Extension to walker that allows for on the fly modifications to tree - ParserContext context; - - public ParserWalkerChange(ParserContext c) { - super(c); - context = c; - } - - @Override - public ParserContext getParserContext() { - return context; - } - - public ConstructState getPoint() { - return point; - } - - public void setOffset(int off) { - point.offset = off; - } - - public void setConstructor(Constructor c) { - point.ct = c; - } - - public void setCurrentLength(int len) { - point.length = len; - } - - public void calcCurrentLength(int length, int numopers) { - // Calculate the length of the current constructor - // state assuming all its operands are constructed - length += point.offset; // Convert relative length to absolute length - for (int i = 0; i < numopers; ++i) { - ConstructState subpoint = point.resolve.get(i); - int sublength = subpoint.length + subpoint.offset; - // Since subpoint->offset is an absolute offset - // (relative to beginning of instruction) sublength - if (sublength > length) { - length = sublength; - } - } - point.length = length - point.offset; // Convert back to relative length - } -} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/ConstTpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/ConstTpl.java index e21873bc07..341877dae8 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/ConstTpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/ConstTpl.java @@ -20,13 +20,10 @@ import java.io.PrintStream; import org.jdom.Element; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.error.LowlevelError; import ghidra.pcodeCPort.space.AddrSpace; import ghidra.pcodeCPort.space.spacetype; import ghidra.pcodeCPort.translate.Translate; -import ghidra.pcodeCPort.utils.AddrSpaceToIdSymmetryMap; import ghidra.pcodeCPort.utils.XmlUtils; public class ConstTpl { @@ -41,6 +38,7 @@ public class ConstTpl { handle, j_start, j_next, + j_next2, j_curspace, j_curspace_size, spaceid, @@ -198,138 +196,6 @@ public class ConstTpl { return 0; } - public long fix(ParserWalker walker) { - // Get the value of the ConstTpl in context - // NOTE: if the property is dynamic this returns the property - // of the temporary storage - switch (type) { - case j_start: - return walker.getAddr().getOffset(); // Fill in starting address placeholder with real address - case j_next: - return walker.getNaddr().getOffset(); // Fill in next address placeholder with real address - case j_curspace_size: - return walker.getCurSpace().getAddrSize(); - case j_curspace: - return AddrSpaceToIdSymmetryMap.getID(walker.getCurSpace()); - case handle: { - FixedHandle hand = walker.getFixedHandle(handle_index); - switch (select) { - case v_space: - if (hand.offset_space == null) { - return AddrSpaceToIdSymmetryMap.getID(hand.space); - } - return AddrSpaceToIdSymmetryMap.getID(hand.temp_space); - case v_offset: - if (hand.offset_space == null) { - return hand.offset_offset; - } - return hand.temp_offset; - case v_size: - return hand.size; - case v_offset_plus: - if (hand.space != walker.getConstSpace()) { // If we are not a constant - if (hand.offset_space == null) { - return hand.offset_offset + (value_real&0xffff); - } - return hand.temp_offset + (value_real&0xffff); - } - // If we are a constant, return a shifted value - long val; - if (hand.offset_space == null) - val = hand.offset_offset; - else - val = hand.temp_offset; - val >>= 8 * (value_real >> 16); - return val; - } - break; - } - case j_relative: - case real: - return value_real; - case spaceid: - return AddrSpaceToIdSymmetryMap.getID(spaceid); - default: - break; - } - return 0; // Should never reach here - } - - // Get the value of the ConstTpl in context - // when we know it is a space - public AddrSpace fixSpace(ParserWalker walker) { - // Get the value of the ConstTpl in context - // when we know it is a space - switch (type) { - case j_curspace: - return walker.getCurSpace(); - case handle: { - FixedHandle hand = walker.getFixedHandle(handle_index); - switch (select) { - case v_space: - if (hand.offset_space == null) { - return hand.space; - } - return hand.temp_space; - default: - break; - } - break; - } - case spaceid: - return spaceid; - default: - break; - } - throw new LowlevelError("ConstTpl is not a spaceid as expected"); - } - - // Fill in the space portion of a FixedHandle, base on this ConstTpl - public void fillinSpace(FixedHandle hand, ParserWalker walker) { - switch (type) { - case j_curspace: - hand.space = walker.getCurSpace(); - return; - case handle: { - FixedHandle otherhand = walker.getFixedHandle(handle_index); - switch (select) { - case v_space: - hand.space = otherhand.space; - return; - default: - break; - } - break; - } - case spaceid: - hand.space = spaceid; - return; - default: - break; - } - throw new LowlevelError("ConstTpl is not a spaceid as expected"); - } - - // Fillin the offset portion of a FixedHandle, based on this ConstTpl - // If the offset value is dynamic, indicate this in the handle - // we don't just fill in the temporary variable offset - // we assume hand.space is already filled in - public void fillinOffset(FixedHandle hand, ParserWalker walker) { - if (type == const_type.handle) { - FixedHandle otherhand = walker.getFixedHandle(handle_index); - hand.offset_space = otherhand.offset_space; - hand.offset_offset = otherhand.offset_offset; - hand.offset_size = otherhand.offset_size; - hand.temp_space = otherhand.temp_space; - hand.temp_offset = otherhand.temp_offset; - } - else { - hand.offset_space = null; - hand.offset_offset = fix(walker); - hand.offset_offset &= hand.space.getMask(); - } - } - private void copyIntoMe(ConstTpl other) { type = other.type; spaceid = other.spaceid; @@ -434,6 +300,9 @@ public class ConstTpl { case j_next: s.append("next\"/>"); break; + case j_next2: + s.append("next2\"/>"); + break; case j_curspace: s.append("curspace\"/>"); break; @@ -485,6 +354,9 @@ public class ConstTpl { else if (typestring.equals("next")) { type = const_type.j_next; } + else if (typestring.equals("next2")) { + type = const_type.j_next2; + } else if (typestring.equals("curspace")) { type = const_type.j_curspace; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/HandleTpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/HandleTpl.java index 8f23c6a93e..5777ea7d7e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/HandleTpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/HandleTpl.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +15,15 @@ */ package ghidra.pcodeCPort.semantics; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.space.AddrSpace; -import ghidra.pcodeCPort.space.spacetype; -import ghidra.pcodeCPort.translate.Translate; - import java.io.PrintStream; import java.util.List; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.space.AddrSpace; +import ghidra.pcodeCPort.translate.Translate; + public class HandleTpl { private ConstTpl space; @@ -114,33 +110,6 @@ public class HandleTpl { // Build handle to thing being pointed at by -vn- } - public void fix(FixedHandle hand, ParserWalker walker) { - if (ptrspace.getType() == ConstTpl.const_type.real) { - // The export is unstarred, but this doesn't mean the varnode - // being exported isn't dynamic - space.fillinSpace(hand, walker); - hand.size = (int) size.fix(walker); - ptroffset.fillinOffset(hand, walker); - } - else { - hand.space = space.fixSpace(walker); - hand.size = (int) size.fix(walker); - hand.offset_offset = ptroffset.fix(walker); - hand.offset_space = ptrspace.fixSpace(walker); - if (hand.offset_space.getType() == spacetype.IPTR_CONSTANT) { - // Handle could have been dynamic but wasn't - hand.offset_space = null; - hand.offset_offset <<= hand.space.getScale(); - hand.offset_offset &= hand.space.getMask(); - } - else { - hand.offset_size = (int) ptrsize.fix(walker); - hand.temp_space = temp_space.fixSpace(walker); - hand.temp_offset = temp_offset.fix(walker); - } - } - } - public void changeHandleIndex(VectorSTL handmap) { space.changeHandleIndex(handmap); size.changeHandleIndex(handmap); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/PcodeBuilder.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/PcodeBuilder.java index 6b67b850fb..233577d4b0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/PcodeBuilder.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/PcodeBuilder.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +17,6 @@ package ghidra.pcodeCPort.semantics; import generic.stl.IteratorSTL; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.translate.UnimplError; // SLEIGH specific pcode generator @@ -27,8 +25,6 @@ public abstract class PcodeBuilder { private int labelbase; private int labelcount; - protected ParserWalker walker; - protected abstract void dump(OpTpl op); public PcodeBuilder(int lbcnt) { @@ -42,10 +38,6 @@ public abstract class PcodeBuilder { return labelbase; } - public ParserWalker getCurrentWalker() { - return walker; - } - public abstract void appendBuild(OpTpl bld, int secnum); public abstract void appendCrossBuild(OpTpl bld, int secnum); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/VarnodeTpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/VarnodeTpl.java index 94c4c0dc44..dbe481e408 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/VarnodeTpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/semantics/VarnodeTpl.java @@ -21,8 +21,6 @@ import java.util.List; import org.jdom.Element; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.semantics.ConstTpl.const_type; import ghidra.pcodeCPort.semantics.ConstTpl.v_field; import ghidra.pcodeCPort.space.spacetype; @@ -129,17 +127,6 @@ public class VarnodeTpl { return true; } - public boolean isDynamic(ParserWalker walker) { - if (offset.getType() != ConstTpl.const_type.handle) { - return false; - } - // Technically we should probably check all three - // ConstTpls for dynamic handles, but in all cases - // if there is any dynamic piece then the offset is - FixedHandle hand = walker.getFixedHandle(offset.getHandleIndex()); - return (hand.offset_space != null); - } - public int transfer(VectorSTL params) { boolean doesOffsetPlus = false; int handleIndex=0; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java index f390239f16..292e01436b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java @@ -289,6 +289,8 @@ public class SleighCompile extends SleighBase { symtab.addSymbol(startsym); EndSymbol endsym = new EndSymbol(location, "inst_next", getConstantSpace()); symtab.addSymbol(endsym); + Next2Symbol next2sym = new Next2Symbol(location, "inst_next2", getConstantSpace()); + symtab.addSymbol(next2sym); EpsilonSymbol epsilon = new EpsilonSymbol(location, "epsilon", getConstantSpace()); symtab.addSymbol(epsilon); } @@ -1280,7 +1282,8 @@ public class SleighCompile extends SleighBase { VectorSTL vallist = new VectorSTL<>(); pe.listValues(vallist); for (int i = 0; i < vallist.size(); ++i) { - if (vallist.get(i) instanceof EndInstructionValue) { + PatternValue v = vallist.get(i); + if (v instanceof EndInstructionValue || v instanceof Next2InstructionValue) { return false; } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/Yylval.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/Yylval.java index 4c252b2f10..f165ca6b8b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/Yylval.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/Yylval.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +31,7 @@ class Yylval { OperandSymbol operandsym; StartSymbol startsym; EndSymbol endsym; + Next2Symbol next2sym; SubtableSymbol subtablesym; MacroSymbol macrosym; LabelSymbol labelsym; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/AndExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/AndExpression.java index a382da646e..0b3fbbdcd7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/AndExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/AndExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class AndExpression extends BinaryExpression { public AndExpression(Location location) { @@ -33,13 +31,6 @@ public class AndExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval & rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ConstantValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ConstantValue.java index 1b576f5e9a..9e8da619c6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ConstantValue.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ConstantValue.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +15,15 @@ */ package ghidra.pcodeCPort.slghpatexpress; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.translate.Translate; -import ghidra.pcodeCPort.utils.XmlUtils; -import ghidra.sleigh.grammar.Location; - import java.io.PrintStream; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.translate.Translate; +import ghidra.pcodeCPort.utils.XmlUtils; +import ghidra.sleigh.grammar.Location; + public class ConstantValue extends PatternValue { long val; @@ -39,11 +37,6 @@ public class ConstantValue extends PatternValue { val = v; } - @Override - public long getValue(ParserWalker pos) { - return val; - } - @Override public TokenPattern genMinPattern(VectorSTL ops) { return new TokenPattern(location); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ContextField.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ContextField.java index 98f9eb62da..6f9f77b457 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ContextField.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ContextField.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +15,16 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + +import org.jdom.Element; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.translate.Translate; import ghidra.pcodeCPort.utils.Utils; import ghidra.pcodeCPort.utils.XmlUtils; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - -import org.jdom.Element; - public class ContextField extends PatternValue { private int startbit, endbit; @@ -80,19 +78,6 @@ public class ContextField extends PatternValue { shift = 7 - (endbit % 8); } - @Override - public long getValue(ParserWalker pos) { - long res = ExpressUtils.getContextBytes(pos, startbyte, endbyte); - res >>>= shift; - if (signbit) { - res = Utils.zzz_sign_extend(res, endbit - startbit); - } - else { - res = Utils.zzz_zero_extend(res, endbit - startbit); - } - return res; - } - @Override public String toString() { return "cf:{" + startbit + "," + endbit + "," + startbyte + "," + endbyte + "," + shift + diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/DivExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/DivExpression.java index 7e72c11c5f..17bd82d9b9 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/DivExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/DivExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class DivExpression extends BinaryExpression { public DivExpression(Location location) { @@ -33,13 +31,6 @@ public class DivExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval / rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/EndInstructionValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/EndInstructionValue.java index 7f32903fe9..ad4b58ed31 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/EndInstructionValue.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/EndInstructionValue.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,26 +15,20 @@ */ package ghidra.pcodeCPort.slghpatexpress; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.translate.Translate; -import ghidra.sleigh.grammar.Location; - import java.io.PrintStream; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.translate.Translate; +import ghidra.sleigh.grammar.Location; + public class EndInstructionValue extends PatternValue { public EndInstructionValue(Location location) { super(location); } - @Override - public long getValue(ParserWalker pos) { - return (pos.getNaddr().getOffset() >>> pos.getNaddr().getSpace().getScale()); - } - @Override public TokenPattern genMinPattern(VectorSTL ops) { return new TokenPattern(location); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ExpressUtils.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ExpressUtils.java index 89722aa771..e695050a45 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ExpressUtils.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/ExpressUtils.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,55 +16,9 @@ package ghidra.pcodeCPort.slghpatexpress; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.utils.Utils; public class ExpressUtils { - // Build a long from the instruction bytes - static long getInstructionBytes(ParserWalker pos, int bytestart, int byteend, boolean bigendian) { - long res = 0; - - int size = byteend - bytestart + 1; - int tmpsize = size; - while (tmpsize >= 4) { - int tmp = pos.getInstructionBytes(bytestart, 4); - res <<= 32; - res |= tmp; - bytestart += 4; - tmpsize -= 4; - } - if (tmpsize > 0) { - int tmp = pos.getInstructionBytes(bytestart, tmpsize); - res <<= 8 * tmpsize; - res |= tmp; - } - if (!bigendian) { - res = Utils.byte_swap(res, size); - } - return res; - } - - // Build a intb from the context bytes - static long getContextBytes(ParserWalker pos, int bytestart, int byteend) { - long res = 0; - - int size = byteend - bytestart + 1; - while (size >= 4) { - int tmp = pos.getContextBytes(bytestart, 4); - res <<= 32; - res |= tmp; - bytestart += 4; - size = byteend - bytestart + 1; - } - if (size > 0) { - int tmp = pos.getContextBytes(bytestart, size); - res <<= 8 * size; - res |= tmp; - } - return res; - } - static boolean advance_combo(VectorSTL val, VectorSTL min, VectorSTL max) { int i = 0; while (i < val.size()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/LeftShiftExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/LeftShiftExpression.java index f79303ae56..947d393efd 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/LeftShiftExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/LeftShiftExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class LeftShiftExpression extends BinaryExpression { public LeftShiftExpression(Location location) { @@ -33,13 +31,6 @@ public class LeftShiftExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval << rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MinusExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MinusExpression.java index f97698e5af..4f5ba57788 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MinusExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MinusExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class MinusExpression extends UnaryExpression { public MinusExpression(Location location) { @@ -33,12 +31,6 @@ public class MinusExpression extends UnaryExpression { super(location, u); } - @Override - public long getValue(ParserWalker pos) { - long val = getUnary().getValue(pos); - return -val; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long val = getUnary().getSubValue(replace, listpos); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MultExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MultExpression.java index aee626ce00..5fff27e07e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MultExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/MultExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class MultExpression extends BinaryExpression { public MultExpression(Location location) { @@ -33,13 +31,6 @@ public class MultExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval * rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/Next2InstructionValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/Next2InstructionValue.java new file mode 100644 index 0000000000..5ac352fb09 --- /dev/null +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/Next2InstructionValue.java @@ -0,0 +1,61 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.pcodeCPort.slghpatexpress; + +import java.io.PrintStream; + +import org.jdom.Element; + +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.translate.Translate; +import ghidra.sleigh.grammar.Location; + +public class Next2InstructionValue extends PatternValue { + + public Next2InstructionValue(Location location) { + super(location); + } + + @Override + public TokenPattern genMinPattern(VectorSTL ops) { + return new TokenPattern(location); + } + + @Override + public TokenPattern genPattern(long val) { + return new TokenPattern(location); + } + + @Override + public long minValue() { + return 0; + } + + @Override + public long maxValue() { + return 0; + } + + @Override + public void saveXml(PrintStream s) { + s.append(""); + } + + @Override + public void restoreXml(Element el, Translate trans) { + } + +} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/NotExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/NotExpression.java index 303bb1a06a..3c154906b6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/NotExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/NotExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class NotExpression extends UnaryExpression { public NotExpression(Location location) { @@ -33,12 +31,6 @@ public class NotExpression extends UnaryExpression { super(location, u); } - @Override - public long getValue(ParserWalker pos) { - long val = getUnary().getValue(pos); - return ~val; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long val = getUnary().getSubValue(replace, listpos); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OperandValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OperandValue.java index 63fce1db89..c45a9a5f4e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OperandValue.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OperandValue.java @@ -20,7 +20,7 @@ import java.io.PrintStream; import org.jdom.Element; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.*; +import ghidra.pcodeCPort.context.SleighError; import ghidra.pcodeCPort.sleighbase.SleighBase; import ghidra.pcodeCPort.slghsymbol.*; import ghidra.pcodeCPort.translate.Translate; @@ -79,28 +79,6 @@ public class OperandValue extends PatternValue { throw new SleighError("Operand used in pattern expression", ct.location); } - // Get the value of an operand when it is used in - // an expression. - @Override - public long getValue(ParserWalker pos) { - OperandSymbol sym = ct.getOperand(index); - PatternExpression patexp = sym.getDefiningExpression(); - if (patexp == null) { - TripleSymbol defsym = sym.getDefiningSymbol(); - if (defsym != null) { - patexp = defsym.getPatternExpression(); - } - if (patexp == null) { - return 0; - } - } - ConstructState tempstate = new ConstructState(); - ParserWalker newwalker = new ParserWalker(pos.getParserContext()); - newwalker.setOutOfBandState(ct, index, tempstate, pos); - long res = patexp.getValue(newwalker); - return res; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { OperandSymbol sym = ct.getOperand(index); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OrExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OrExpression.java index 855e19d917..524e87b8b4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OrExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/OrExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class OrExpression extends BinaryExpression { public OrExpression(Location location) { @@ -33,13 +31,6 @@ public class OrExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval | rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PatternExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PatternExpression.java index a4883f6b94..2842fa83af 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PatternExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PatternExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +15,15 @@ */ package ghidra.pcodeCPort.slghpatexpress; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.translate.Translate; -import ghidra.pcodeCPort.utils.MutableInt; -import ghidra.sleigh.grammar.Location; - import java.io.PrintStream; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.translate.Translate; +import ghidra.pcodeCPort.utils.MutableInt; +import ghidra.sleigh.grammar.Location; + public abstract class PatternExpression { public final Location location; @@ -39,8 +37,6 @@ public abstract class PatternExpression { refcount = 0; } - public abstract long getValue(ParserWalker pos); - public abstract TokenPattern genMinPattern(VectorSTL ops); public abstract void listValues(VectorSTL list); @@ -91,6 +87,9 @@ public abstract class PatternExpression { else if (nm.equals("end_exp")) { res = new EndInstructionValue(null); } + else if (nm.equals("next2_exp")) { + res = new Next2InstructionValue(null); + } else if (nm.equals("plus_exp")) { res = new PlusExpression(null); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PlusExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PlusExpression.java index b28a7be485..4abad9aa17 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PlusExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/PlusExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class PlusExpression extends BinaryExpression { public PlusExpression(Location location) { @@ -33,13 +31,6 @@ public class PlusExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval + rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/RightShiftExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/RightShiftExpression.java index d537fa167f..e0009fbb96 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/RightShiftExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/RightShiftExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class RightShiftExpression extends BinaryExpression { public RightShiftExpression(Location location) { @@ -33,13 +31,6 @@ public class RightShiftExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval >>> rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/StartInstructionValue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/StartInstructionValue.java index b9a31ecfcb..01331577ff 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/StartInstructionValue.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/StartInstructionValue.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,26 +15,20 @@ */ package ghidra.pcodeCPort.slghpatexpress; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.translate.Translate; -import ghidra.sleigh.grammar.Location; - import java.io.PrintStream; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.translate.Translate; +import ghidra.sleigh.grammar.Location; + public class StartInstructionValue extends PatternValue { public StartInstructionValue(Location location) { super(location); } - @Override - public long getValue(ParserWalker pos) { - return (pos.getAddr().getOffset() >> pos.getAddr().getSpace().getScale()); - } - @Override public TokenPattern genMinPattern(VectorSTL ops) { return new TokenPattern(location); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/SubExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/SubExpression.java index 66de63ff6e..b97da64f48 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/SubExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/SubExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class SubExpression extends BinaryExpression { public SubExpression(Location location) { @@ -33,13 +31,6 @@ public class SubExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval - rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/TokenField.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/TokenField.java index fdb6875e06..ac3f1ab790 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/TokenField.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/TokenField.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +15,17 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + +import org.jdom.Element; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.context.Token; import ghidra.pcodeCPort.translate.Translate; import ghidra.pcodeCPort.utils.Utils; import ghidra.pcodeCPort.utils.XmlUtils; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - -import org.jdom.Element; - public class TokenField extends PatternValue { private Token tok; @@ -77,21 +75,6 @@ public class TokenField extends PatternValue { shift = bitstart % 8; } - @Override - public long getValue(ParserWalker pos) { // Construct value given specific - // instruction stream - long res = ExpressUtils.getInstructionBytes(pos, bytestart, byteend, bigendian); - - res >>>= shift; - if (signbit) { - res = Utils.zzz_sign_extend(res, bitend - bitstart); - } - else { - res = Utils.zzz_zero_extend(res, bitend - bitstart); - } - return res; - } - @Override public TokenPattern genPattern(long val) { // Generate corresponding pattern if the // value is forced to be val diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/XorExpression.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/XorExpression.java index 9dc0c03e58..5a482aea2f 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/XorExpression.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpatexpress/XorExpression.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghpatexpress; +import java.io.PrintStream; + import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.MutableInt; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - public class XorExpression extends BinaryExpression { public XorExpression(Location location) { @@ -33,13 +31,6 @@ public class XorExpression extends BinaryExpression { super(location, l, r); } - @Override - public long getValue(ParserWalker pos) { - long leftval = getLeft().getValue(pos); - long rightval = getRight().getValue(pos); - return leftval ^ rightval; - } - @Override public long getSubValue(VectorSTL replace, MutableInt listpos) { long leftval = getLeft().getSubValue(replace, listpos); // Must be left first diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/CombinePattern.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/CombinePattern.java index 6079504f5f..9f07b6510a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/CombinePattern.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/CombinePattern.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.pcodeCPort.slghpattern; -import ghidra.pcodeCPort.context.ParserWalker; - import java.io.PrintStream; import java.util.List; @@ -63,17 +60,6 @@ public class CombinePattern extends DisjointPattern { } } - @Override - public boolean isMatch(ParserWalker pos) { - if (!instr.isMatch(pos)) { - return false; - } - if (!context.isMatch(pos)) { - return false; - } - return true; - } - @Override public boolean alwaysTrue() { return (context.alwaysTrue() && instr.alwaysTrue()); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/ContextPattern.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/ContextPattern.java index 7bbc5a839e..4318b766a4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/ContextPattern.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/ContextPattern.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.pcodeCPort.slghpattern; -import ghidra.pcodeCPort.context.ParserWalker; - import java.io.PrintStream; import java.util.List; @@ -60,11 +57,6 @@ public class ContextPattern extends DisjointPattern { public void shiftInstruction(int sa) { } // do nothing - @Override - public boolean isMatch(ParserWalker pos) { - return maskvalue.isContextMatch(pos, 0); - } - @Override public boolean alwaysTrue() { return maskvalue.alwaysTrue(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/InstructionPattern.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/InstructionPattern.java index 0a785f68d0..c59a9abec0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/InstructionPattern.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/InstructionPattern.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.pcodeCPort.slghpattern; -import ghidra.pcodeCPort.context.ParserWalker; - import java.io.PrintStream; import java.util.List; @@ -70,11 +67,6 @@ public class InstructionPattern extends DisjointPattern { maskvalue.shift(sa); } - @Override - public boolean isMatch(ParserWalker pos) { - return maskvalue.isInstructionMatch(pos, 0); - } - @Override public boolean alwaysTrue() { return maskvalue.alwaysTrue(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/OrPattern.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/OrPattern.java index b0c14e28e8..dddbf19e37 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/OrPattern.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/OrPattern.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +15,15 @@ */ package ghidra.pcodeCPort.slghpattern; -import generic.stl.IteratorSTL; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; - import java.io.PrintStream; import java.util.Iterator; import java.util.List; import org.jdom.Element; +import generic.stl.IteratorSTL; +import generic.stl.VectorSTL; + public class OrPattern extends Pattern { private VectorSTL orlist = new VectorSTL(); @@ -71,16 +69,6 @@ public class OrPattern extends Pattern { } } - @Override - public boolean isMatch(ParserWalker pos) { - for (int i = 0; i < orlist.size(); ++i) { - if (orlist.get(i).isMatch(pos)) { - return true; - } - } - return false; - } - // This isn't quite right because different branches // may cover the entire gamut @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/Pattern.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/Pattern.java index 6b8665b93a..df2197a1c3 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/Pattern.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/Pattern.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.pcodeCPort.slghpattern; -import ghidra.pcodeCPort.context.ParserWalker; - import java.io.PrintStream; import org.jdom.Element; @@ -37,8 +34,6 @@ public abstract class Pattern { public abstract Pattern commonSubPattern(Pattern b, int sa); - public abstract boolean isMatch(ParserWalker pos); // Does this pattern match context - public abstract int numDisjoint(); public abstract DisjointPattern getDisjoint(int i); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/PatternBlock.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/PatternBlock.java index 4d70db920d..c6da6a167a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/PatternBlock.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghpattern/PatternBlock.java @@ -23,7 +23,6 @@ import org.jdom.Element; import generic.stl.IteratorSTL; import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.utils.Utils; import ghidra.pcodeCPort.utils.XmlUtils; @@ -364,36 +363,6 @@ public class PatternBlock { return res; } - public boolean isInstructionMatch(ParserWalker pos, int off) { - if (nonzerosize <= 0) { - return (nonzerosize == 0); - } - off += offset; - for (int i = 0; i < maskvec.size(); ++i) { - int data = pos.getInstructionBytes(off, 4); - if ((maskvec.get(i) & data) != valvec.get(i)) { - return false; - } - off += 4; - } - return true; - } - - public boolean isContextMatch(ParserWalker pos, int off) { - if (nonzerosize <= 0) { - return (nonzerosize == 0); - } - off += offset; - for (int i = 0; i < maskvec.size(); ++i) { - int data = pos.getContextBytes(off, 4); - if ((maskvec.get(i) & data) != valvec.get(i)) { - return false; - } - off += 4; - } - return true; - } - public void saveXml(PrintStream s) { s.append(" iter = context.begin(); - for (; !iter.isEnd(); iter.increment()) { - iter.get().apply(pos); - } - } - public void markSubtableOperands(VectorSTL check) { // Adjust -check- so it has one entry for every operand, a 0 if it is a subtable, a 2 if it is not check.resize(operands.size(), 0); @@ -296,65 +289,6 @@ public class Constructor { namedtempl.set(id, tpl); } - public void print(PrintStream s, ParserWalker pos) { - IteratorSTL piter; - for (piter = printpiece.begin(); !piter.isEnd(); piter.increment()) { - if (piter.get().charAt(0) == '\n') { - int index = piter.get().charAt(1) - 'A'; - operands.get(index).print(s, pos); - } - else { - s.append(piter.get()); - } - } - } - - public void printMnemonic(PrintStream s, ParserWalker pos) { - if (flowthruindex != -1) { - TripleSymbol definingSymbol = operands.get(flowthruindex).getDefiningSymbol(); - if (definingSymbol instanceof SubtableSymbol) { - pos.pushOperand(flowthruindex); - pos.getConstructor().printMnemonic(s, pos); - pos.popOperand(); - return; - } - } - int endind = (firstwhitespace == -1) ? printpiece.size() : firstwhitespace; - for (int i = 0; i < endind; ++i) { - if (printpiece.get(i).charAt(0) == '\n') { - int index = printpiece.get(i).charAt(1) - 'A'; - operands.get(index).print(s, pos); - } - else { - s.append(printpiece.get(i)); - } - } - } - - public void printBody(PrintStream s, ParserWalker pos) { - if (flowthruindex != -1) { - TripleSymbol sym = operands.get(flowthruindex).getDefiningSymbol(); - if (sym instanceof SubtableSymbol) { - pos.pushOperand(flowthruindex); - pos.getConstructor().printBody(s, pos); - pos.popOperand(); - return; - } - } - if (firstwhitespace == -1) { - return; // Nothing to print after firstwhitespace - } - for (int i = firstwhitespace + 1; i < printpiece.size(); ++i) { - if (printpiece.get(i).charAt(0) == '\n') { - int index = printpiece.get(i).charAt(1) - 'A'; - operands.get(index).print(s, pos); - } - else { - s.append(printpiece.get(i)); - } - } - } - // Allow for user to force extra space at end of printing public void removeTrailingSpace() { if ((!printpiece.empty()) && (printpiece.back().equals(" "))) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextChange.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextChange.java index 7fbfc3f9cc..450f510626 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextChange.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextChange.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,12 @@ */ package ghidra.pcodeCPort.slghsymbol; -import ghidra.pcodeCPort.context.ParserWalkerChange; -import ghidra.pcodeCPort.sleighbase.SleighBase; - import java.io.PrintStream; import org.jdom.Element; +import ghidra.pcodeCPort.sleighbase.SleighBase; + // Change to context command public abstract class ContextChange { @@ -35,8 +33,6 @@ public abstract class ContextChange { public abstract void restoreXml(Element el, SleighBase trans); - public abstract void apply(ParserWalkerChange pos); - public void dispose() { } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextCommit.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextCommit.java index 67eb54bab4..5f1dea2242 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextCommit.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ContextCommit.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +15,13 @@ */ package ghidra.pcodeCPort.slghsymbol; -import ghidra.pcodeCPort.context.ParserWalkerChange; -import ghidra.pcodeCPort.sleighbase.SleighBase; -import ghidra.pcodeCPort.utils.*; - import java.io.PrintStream; import org.jdom.Element; +import ghidra.pcodeCPort.sleighbase.SleighBase; +import ghidra.pcodeCPort.utils.*; + public class ContextCommit extends ContextChange { private TripleSymbol sym; @@ -49,12 +47,6 @@ public class ContextCommit extends ContextChange { mask = m.get(); } - @Override - public void apply(ParserWalkerChange pos) { - pos.getParserContext().addCommit(sym, num, mask, flow, pos.getPoint()); - - } - @Override public void saveXml(PrintStream s) { s.append("> iter; - for (iter = list.begin(); !iter.isEnd(); iter.increment()) { - if (iter.get().first.isMatch(pos)) { - return iter.get().second; - } - } - throw new BadDataError(pos.getAddr().getShortcut() + pos.getAddr().toString() + - ": Unable to resolve constructor"); - } - int val; - if (contextdecision) { - val = pos.getContextBits(startbit, bitsize); - } - else { - val = pos.getInstructionBits(startbit, bitsize); - } - return children.get(val).resolve(pos); - } - void saveXml(PrintStream s) { s.append("= nametable.size()) || (ind < 0) || (nametable.get(ind).length() == 0)) { - throw new BadDataError( - "No corresponding entry in nametable <" + getName() + ">, index=" + ind); - } - } - return null; - } - @Override public symbol_type getType() { return symbol_type.name_symbol; } - @Override - public void print(PrintStream s, ParserWalker pos) - - { - int ind = (int) patval.getValue(pos); - // ind is already checked to be in range by the resolve routine - s.print(nametable.get(ind)); - } - @Override public void saveXml(PrintStream s) { s.append(""); + } + + @Override + public void saveXmlHeader(PrintStream s) { + s.append(""); + } + + @Override + public void restoreXml(Element el, SleighBase trans) { + const_space = trans.getConstantSpace(); + patexp = new Next2InstructionValue(null); + patexp.layClaim(); + } + +} diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/OperandSymbol.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/OperandSymbol.java index 6067713bd2..139bd79912 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/OperandSymbol.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/OperandSymbol.java @@ -21,7 +21,7 @@ import java.util.List; import org.jdom.Element; -import ghidra.pcodeCPort.context.*; +import ghidra.pcodeCPort.context.SleighError; import ghidra.pcodeCPort.semantics.VarnodeTpl; import ghidra.pcodeCPort.sleighbase.SleighBase; import ghidra.pcodeCPort.slghpatexpress.OperandValue; @@ -168,11 +168,6 @@ public class OperandSymbol extends SpecificSymbol { return new VarnodeTpl(location, hand, false); // Possible dynamic handle } - @Override - public void getFixedHandle(FixedHandle hnd, ParserWalker pos) { - hnd = pos.getFixedHandle(hand); - } - @Override public int getSize() { if (triple != null) { @@ -181,31 +176,6 @@ public class OperandSymbol extends SpecificSymbol { return 0; } - @Override - public void print(PrintStream s, ParserWalker pos) { - pos.pushOperand(getIndex()); - if (triple != null) { - if (triple.getType() == symbol_type.subtable_symbol) { - pos.getConstructor().print(s, pos); - } - else { - triple.print(s, pos); - } - } - else { - long val = defexp.getValue(pos); - if (val >= 0) { - s.append("0x"); - s.append(Long.toHexString(val)); - } - else { - s.append("-0x"); - s.append(Long.toHexString(-val)); - } - } - pos.popOperand(); - } - @Override public void collectLocalValues(ArrayList results) { if (triple != null) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/StartSymbol.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/StartSymbol.java index d41e657184..0d8cd821d2 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/StartSymbol.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/StartSymbol.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,10 @@ */ package ghidra.pcodeCPort.slghsymbol; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; +import java.io.PrintStream; + +import org.jdom.Element; + import ghidra.pcodeCPort.semantics.ConstTpl; import ghidra.pcodeCPort.semantics.VarnodeTpl; import ghidra.pcodeCPort.sleighbase.SleighBase; @@ -26,10 +27,6 @@ import ghidra.pcodeCPort.slghpatexpress.StartInstructionValue; import ghidra.pcodeCPort.space.AddrSpace; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; - -import org.jdom.Element; - public class StartSymbol extends SpecificSymbol { private AddrSpace const_space; private PatternExpression patexp; @@ -72,21 +69,6 @@ public class StartSymbol extends SpecificSymbol { return new VarnodeTpl(location, spc, off, sz_zero); } - @Override - public void getFixedHandle(FixedHandle hand, ParserWalker pos) { - hand.space = pos.getCurSpace(); - hand.offset_space = null; - hand.offset_offset = pos.getAddr().getOffset(); // Get starting address of instruction - hand.size = hand.space.getAddrSize(); - } - - @Override - public void print(PrintStream s, ParserWalker pos) { - long val = pos.getAddr().getOffset(); - s.append("0x"); - s.print(Long.toHexString(val)); - } - @Override public void saveXml(PrintStream s) { s.append(" results) { for (Constructor curConstruct : construct) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/SymbolTable.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/SymbolTable.java index 0a735239fb..76f476a8d2 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/SymbolTable.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/SymbolTable.java @@ -15,6 +15,12 @@ */ package ghidra.pcodeCPort.slghsymbol; +import java.io.PrintStream; +import java.util.Iterator; +import java.util.List; + +import org.jdom.Element; + import generic.stl.IteratorSTL; import generic.stl.VectorSTL; import ghidra.pcodeCPort.context.SleighError; @@ -22,12 +28,6 @@ import ghidra.pcodeCPort.sleighbase.SleighBase; import ghidra.pcodeCPort.utils.XmlUtils; import ghidra.sleigh.grammar.Location; -import java.io.PrintStream; -import java.util.Iterator; -import java.util.List; - -import org.jdom.Element; - public class SymbolTable { private VectorSTL symbollist = new VectorSTL(); @@ -300,6 +300,9 @@ public class SymbolTable { else if (el.getName().equals("end_sym_head")) { sym = new EndSymbol(location); } + else if (el.getName().equals("next2_sym_head")) { + sym = new Next2Symbol(location); + } else if (el.getName().equals("subtable_sym_head")) { sym = new SubtableSymbol(location); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/TripleSymbol.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/TripleSymbol.java index b5b212f9ad..81bec69105 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/TripleSymbol.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/TripleSymbol.java @@ -15,11 +15,8 @@ */ package ghidra.pcodeCPort.slghsymbol; -import java.io.PrintStream; import java.util.ArrayList; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; import ghidra.pcodeCPort.slghpatexpress.PatternExpression; import ghidra.sleigh.grammar.Location; @@ -36,20 +33,12 @@ public abstract class TripleSymbol extends SleighSymbol { public abstract PatternExpression getPatternExpression(); - public abstract void getFixedHandle(FixedHandle hand, ParserWalker pos); - public int getSize() { return 0; } // Size out of context - public abstract void print(PrintStream s, ParserWalker pos); - public void collectLocalValues(ArrayList results) { // By default, assume symbol has no local exports } - public Constructor resolve(ParserWalker pos) { - return null; - } - } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ValueMapSymbol.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ValueMapSymbol.java index 35245063d4..917744de14 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ValueMapSymbol.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slghsymbol/ValueMapSymbol.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +15,19 @@ */ package ghidra.pcodeCPort.slghsymbol; -import generic.stl.VectorSTL; -import ghidra.pcodeCPort.context.FixedHandle; -import ghidra.pcodeCPort.context.ParserWalker; -import ghidra.pcodeCPort.sleighbase.SleighBase; -import ghidra.pcodeCPort.slghpatexpress.PatternExpression; -import ghidra.pcodeCPort.slghpatexpress.PatternValue; -import ghidra.pcodeCPort.translate.BadDataError; -import ghidra.pcodeCPort.utils.XmlUtils; -import ghidra.sleigh.grammar.Location; - import java.io.PrintStream; import java.util.Iterator; import java.util.List; import org.jdom.Element; +import generic.stl.VectorSTL; +import ghidra.pcodeCPort.sleighbase.SleighBase; +import ghidra.pcodeCPort.slghpatexpress.PatternExpression; +import ghidra.pcodeCPort.slghpatexpress.PatternValue; +import ghidra.pcodeCPort.utils.XmlUtils; +import ghidra.sleigh.grammar.Location; + public class ValueMapSymbol extends ValueSymbol { private VectorSTL valuetable = new VectorSTL(); private boolean tableisfilled; @@ -63,41 +59,6 @@ public class ValueMapSymbol extends ValueSymbol { } } - @Override - public Constructor resolve(ParserWalker pos) { - if (!tableisfilled) { - int ind = (int) patval.getValue(pos); - if ((ind >= valuetable.size()) || (ind < 0) || (valuetable.get(ind) == 0xBADBEEF)) { - throw new BadDataError("No corresponding entry in nametable <" + getName() + - ">, index=" + ind); - } - } - return null; - } - - @Override - public void getFixedHandle(FixedHandle hand, ParserWalker pos) { - int ind = (int) patval.getValue(pos); - // The resolve routine has checked that -ind- must be a valid index - hand.space = pos.getConstSpace(); - hand.offset_space = null; // Not a dynamic value - hand.offset_offset = valuetable.get(ind); - hand.size = 0; // Cannot provide size - } - - @Override - public void print(PrintStream s, ParserWalker pos) { - int ind = (int) patval.getValue(pos); - // ind is already checked to be in range by the resolve routine - Long val = valuetable.get(ind); - if (val >= 0) { - s.append("0x").append(Long.toHexString(val)); - } - else { - s.append("-0x").append(Long.toHexString(-val)); - } - } - @Override public void saveXml(PrintStream s) { s.append("= 0) { - s.append("0x"); - s.append(Long.toHexString(val)); - } - else { - s.append("-0x"); - s.append(Long.toHexString(-val)); - } - } - @Override public void saveXml(PrintStream s) { s.append(" varnode_table = new VectorSTL(); @@ -67,32 +63,6 @@ public class VarnodeListSymbol extends ValueSymbol { } } - @Override - public Constructor resolve(ParserWalker walker) { - if (!tableisfilled) { - int ind = (int) patval.getValue(walker); - if ((ind < 0) || (ind >= varnode_table.size()) || (varnode_table.get(ind) == null)) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream s = new PrintStream(baos); - walker.getAddr().printRaw(s); - throw new BadDataError(walker.getAddr().getShortcut() + baos.toString() + - ": No corresponding entry in varnode list"); - } - } - return null; - } - - @Override - public void getFixedHandle(FixedHandle hand, ParserWalker pos) { - int ind = (int) patval.getValue(pos); - // The resolve routine has checked that -ind- must be a valid index - VarnodeData fix = varnode_table.get(ind).getFixedVarnode(); - hand.space = fix.space; - hand.offset_space = null; // Not a dynamic value - hand.offset_offset = fix.offset; - hand.size = fix.size; - } - @Override public int getSize() { for (int i = 0; i < varnode_table.size(); ++i) { @@ -104,15 +74,6 @@ public class VarnodeListSymbol extends ValueSymbol { throw new SleighError("No register attached to: " + getName(), getLocation()); } - @Override - public void print(PrintStream s, ParserWalker pos) { - int ind = (int) patval.getValue(pos); - if (ind >= varnode_table.size()) { - throw new SleighError("Value out of range for varnode table", getLocation()); - } - s.append(varnode_table.get(ind).getName()); - } - @Override public void saveXml(PrintStream s) { s.append(" results) { if (fix.space.getType() == spacetype.IPTR_INTERNAL) { @@ -98,14 +93,6 @@ public class VarnodeSymbol extends PatternlessSymbol { new ConstTpl(ConstTpl.const_type.real, fix.size)); } - @Override - public void getFixedHandle(FixedHandle hand, ParserWalker pos) { - hand.space = fix.space; - hand.offset_space = null; // Not a dynamic symbol - hand.offset_offset = fix.offset; - hand.size = fix.size; - } - @Override public void saveXml(PrintStream s) { s.append(";\n" + "CX = 0;\n" + "\n" + "BX = CX << 2;\n" + "in1 = in2 + 7;"; @@ -186,8 +221,9 @@ public class PcodeParserTest extends AbstractGhidraHeadlessIntegrationTest { assertNull(template.getResult()); assertEquals(template.getNumLabels(), 1); OpTpl[] vec = template.getOpVec(); - assertEquals(vec.length, 10); + assertEquals(vec.length, 13); + // inst_next assertEquals(vec[0].getOpcode(), PcodeOp.COPY); assertTrue(testVarnode(vec[0].getOutput(), SpaceNames.UNIQUE_SPACE_NAME, uniqueBase, 1)); assertEquals(vec[0].getInput().length, 1); @@ -207,46 +243,68 @@ public class PcodeParserTest extends AbstractGhidraHeadlessIntegrationTest { assertTrue( testVarnode(vec[2].getInput()[1], SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x80, 1)); - assertEquals(vec[3].getOpcode(), PcodeOp.CALLIND); - assertNull(vec[3].getOutput()); - assertEquals(vec[3].getInput().length, 1); - assertTrue(testVarnode(vec[3].getInput()[0], "register", 4, 4)); - - assertEquals(vec[4].getOpcode(), PcodeOp.INT_NOTEQUAL); + // inst_next2 + assertEquals(vec[3].getOpcode(), PcodeOp.COPY); assertTrue( - testVarnode(vec[4].getOutput(), SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x100, 1)); + testVarnode(vec[3].getOutput(), SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x100, 1)); + assertEquals(vec[3].getInput().length, 1); + assertTrue(testInstNext2Constant(vec[3].getInput()[0], 1)); + + assertEquals(vec[4].getOpcode(), PcodeOp.INT_EQUAL); + assertTrue( + testVarnode(vec[4].getOutput(), SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x180, 1)); assertEquals(vec[4].getInput().length, 2); assertTrue(testVarnode(vec[4].getInput()[0], "register", 0xc, 2)); - assertTrue(testVarnode(vec[4].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 1, 2)); + assertTrue(testVarnode(vec[4].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 0, 2)); assertEquals(vec[5].getOpcode(), PcodeOp.CBRANCH); assertNull(vec[5].getOutput()); assertEquals(vec[5].getInput().length, 2); - assertTrue(testRelative(vec[5].getInput()[0], 0, 4)); + assertTrue(testInstNext2(vec[5].getInput()[0])); assertTrue( - testVarnode(vec[5].getInput()[1], SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x100, 1)); + testVarnode(vec[5].getInput()[1], SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x180, 1)); - assertEquals(vec[6].getOpcode(), PcodeOp.COPY); - assertTrue(testVarnode(vec[6].getOutput(), "register", 4, 2)); + // call + assertEquals(vec[6].getOpcode(), PcodeOp.CALLIND); + assertNull(vec[6].getOutput()); assertEquals(vec[6].getInput().length, 1); - assertTrue(testVarnode(vec[6].getInput()[0], SpaceNames.CONSTANT_SPACE_NAME, 0, 2)); + assertTrue(testVarnode(vec[6].getInput()[0], "register", 4, 4)); - assertEquals(vec[7].getOpcode(), PcodeOp.PTRADD); // label - assertNull(vec[7].getOutput()); - assertEquals(vec[7].getInput().length, 1); - assertTrue(testVarnode(vec[7].getInput()[0], SpaceNames.CONSTANT_SPACE_NAME, 0, 4)); - - assertEquals(vec[8].getOpcode(), PcodeOp.INT_LEFT); - assertTrue(testVarnode(vec[8].getOutput(), "register", 0xc, 2)); - assertEquals(vec[8].getInput().length, 2); - assertTrue(testVarnode(vec[8].getInput()[0], "register", 0x4, 2)); - assertTrue(testVarnode(vec[8].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 2, 4)); - - assertEquals(vec[9].getOpcode(), PcodeOp.INT_ADD); - assertTrue(testParameter(vec[9].getOutput(), 0)); - assertEquals(vec[9].getInput().length, 2); - assertTrue(testParameter(vec[9].getInput()[0], 1)); + assertEquals(vec[7].getOpcode(), PcodeOp.INT_NOTEQUAL); assertTrue( - testVarnodeHandleSize(vec[9].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 7, 0)); + testVarnode(vec[7].getOutput(), SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x200, 1)); + assertEquals(vec[7].getInput().length, 2); + assertTrue(testVarnode(vec[7].getInput()[0], "register", 0xc, 2)); + assertTrue(testVarnode(vec[7].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 1, 2)); + + assertEquals(vec[8].getOpcode(), PcodeOp.CBRANCH); + assertNull(vec[8].getOutput()); + assertEquals(vec[8].getInput().length, 2); + assertTrue(testRelative(vec[8].getInput()[0], 0, 4)); + assertTrue( + testVarnode(vec[8].getInput()[1], SpaceNames.UNIQUE_SPACE_NAME, uniqueBase + 0x200, 1)); + + assertEquals(vec[9].getOpcode(), PcodeOp.COPY); + assertTrue(testVarnode(vec[9].getOutput(), "register", 4, 2)); + assertEquals(vec[9].getInput().length, 1); + assertTrue(testVarnode(vec[9].getInput()[0], SpaceNames.CONSTANT_SPACE_NAME, 0, 2)); + + assertEquals(vec[10].getOpcode(), PcodeOp.PTRADD); // label + assertNull(vec[10].getOutput()); + assertEquals(vec[10].getInput().length, 1); + assertTrue(testVarnode(vec[10].getInput()[0], SpaceNames.CONSTANT_SPACE_NAME, 0, 4)); + + assertEquals(vec[11].getOpcode(), PcodeOp.INT_LEFT); + assertTrue(testVarnode(vec[11].getOutput(), "register", 0xc, 2)); + assertEquals(vec[11].getInput().length, 2); + assertTrue(testVarnode(vec[11].getInput()[0], "register", 0x4, 2)); + assertTrue(testVarnode(vec[11].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 2, 4)); + + assertEquals(vec[12].getOpcode(), PcodeOp.INT_ADD); + assertTrue(testParameter(vec[12].getOutput(), 0)); + assertEquals(vec[12].getInput().length, 2); + assertTrue(testParameter(vec[12].getInput()[0], 1)); + assertTrue( + testVarnodeHandleSize(vec[12].getInput()[1], SpaceNames.CONSTANT_SPACE_NAME, 7, 0)); } } diff --git a/GhidraDocs/languages/html/additionalpcode.html b/GhidraDocs/languages/html/additionalpcode.html index a822ce92c4..cf80077a56 100644 --- a/GhidraDocs/languages/html/additionalpcode.html +++ b/GhidraDocs/languages/html/additionalpcode.html @@ -3,7 +3,7 @@ Additional P-CODE Operations - + @@ -36,7 +36,7 @@ introduced at a later stage by various analysis algorithms.

MULTIEQUAL

- +
@@ -91,7 +91,7 @@ was last executed. All inputs and outputs must be the same size.

INDIRECT

-
+
@@ -152,7 +152,7 @@ to the operation was used or preserved.

PTRADD

-
+
@@ -210,7 +210,7 @@ and stores it in output.

PTRSUB

-
+
@@ -261,7 +261,7 @@ pointer to the subcomponent and stores it in output.

CAST

-
+
@@ -305,7 +305,7 @@ interpretation as a data-type changes at this point.

INSERT

-
+
@@ -373,7 +373,7 @@ to SLEIGH bitrange syntax such as inp

EXTRACT

-
+
diff --git a/GhidraDocs/languages/html/pcodedescription.html b/GhidraDocs/languages/html/pcodedescription.html index 72f367c268..368b4c2178 100644 --- a/GhidraDocs/languages/html/pcodedescription.html +++ b/GhidraDocs/languages/html/pcodedescription.html @@ -4,7 +4,7 @@ P-Code Operation Reference - + @@ -37,7 +37,7 @@ describing semantics in a processor specification file.

COPY

-
+
@@ -78,7 +78,7 @@ input0 and output must be the same.

LOAD

-
+
@@ -149,7 +149,7 @@ correct byte offset into the space.

STORE

-
+
@@ -212,7 +212,7 @@ correct byte offset into the space.

BRANCH

-
+
@@ -272,7 +272,7 @@ with index 8 by specifying a constant destination “address” of

CBRANCH

-
+
@@ -322,7 +322,7 @@ relative branching. See the discussion for the

BRANCHIND

-
+
@@ -364,7 +364,7 @@ relative branching is not possible with BRANCHIND

CALL

-
+
@@ -428,7 +428,7 @@ into the call.

CALLIND

-
+
@@ -482,7 +482,7 @@ the parameters being passed to the logical call.

RETURN

-
+
@@ -534,7 +534,7 @@ subroutine.

PIECE

-
+
@@ -583,7 +583,7 @@ makes up the most significant part of the output.

SUBPIECE

-
+
@@ -634,7 +634,7 @@ truncated.

POPCOUNT

-
+
@@ -678,7 +678,7 @@ count is zero extended into the output varnode.

INT_EQUAL

-
+
@@ -727,7 +727,7 @@ must have a size of 1.

INT_NOTEQUAL

-
+
@@ -776,7 +776,7 @@ and the output must have a size of 1.

INT_LESS

-
+
@@ -824,7 +824,7 @@ same size, and the output must have a size of 1.

INT_SLESS

-
+
@@ -872,7 +872,7 @@ the output must have a size of 1.

INT_LESSEQUAL

-
+
@@ -920,7 +920,7 @@ same size, and the output must have a size of 1.

INT_SLESSEQUAL

-
+
@@ -968,7 +968,7 @@ and the output must have a size of 1.

INT_ZEXT

-
+
@@ -1012,7 +1012,7 @@ size of input.

INT_SEXT

-
+
@@ -1057,7 +1057,7 @@ than the size of input0.

INT_ADD

-
+
@@ -1108,7 +1108,7 @@ and INT_SCARRY.

INT_SUB

-
+
@@ -1159,7 +1159,7 @@ and INT_LESS.

INT_CARRY

-
+
@@ -1208,7 +1208,7 @@ and output must be size 1.

INT_SCARRY

-
+
@@ -1257,7 +1257,7 @@ and output must be size 1.

INT_SBORROW

-
+
@@ -1308,7 +1308,7 @@ is INT_LESS.

INT_2COMP

-
+
@@ -1351,7 +1351,7 @@ be the same size.

INT_NEGATE

-
+
@@ -1393,7 +1393,7 @@ the same size.

INT_XOR

-
+
@@ -1439,7 +1439,7 @@ and input1. Both inputs and output must be the same size.

INT_AND

-
+
@@ -1485,7 +1485,7 @@ output must be the same size.

INT_OR

-
+
@@ -1531,7 +1531,7 @@ output must be the same size.

INT_LEFT

-
+
@@ -1582,7 +1582,7 @@ size. Input1 can be any size.

INT_RIGHT

-
+
@@ -1633,7 +1633,7 @@ the same size. Input1 can be any size.

INT_SRIGHT

-
+
@@ -1686,7 +1686,7 @@ any size.

INT_MULT

-
+
@@ -1737,7 +1737,7 @@ sign-extended to the desired size.

INT_DIV

-
+
@@ -1787,7 +1787,7 @@ the INT_DIV.

INT_REM

-
+
@@ -1838,7 +1838,7 @@ and INT_ADD operations.

INT_SDIV

-
+
@@ -1888,7 +1888,7 @@ be used before the INT_SDIV.

INT_SREM

-
+
@@ -1939,7 +1939,7 @@ and INT_ADD operations.

BOOL_NEGATE

-
+
@@ -1984,7 +1984,7 @@ or false.

BOOL_XOR

-
+
@@ -2034,7 +2034,7 @@ or false.

BOOL_AND

-
+
@@ -2084,7 +2084,7 @@ or false.

BOOL_OR

-
+
@@ -2134,7 +2134,7 @@ or false.

FLOAT_EQUAL

-
+
@@ -2184,7 +2184,7 @@ to false.

FLOAT_NOTEQUAL

-
+
@@ -2234,7 +2234,7 @@ to false.

FLOAT_LESS

-
+
@@ -2284,7 +2284,7 @@ to false.

FLOAT_LESSEQUAL

-
+
@@ -2334,7 +2334,7 @@ to false.

FLOAT_ADD

-
+
@@ -2384,7 +2384,7 @@ occurs, output is set to NaN.

FLOAT_SUB

-
+
@@ -2434,7 +2434,7 @@ occurs, output is set to NaN.

FLOAT_MULT

-
+
@@ -2484,7 +2484,7 @@ occurs, output is set to NaN.

FLOAT_DIV

-
+
@@ -2534,7 +2534,7 @@ occurs, output is set to NaN.

FLOAT_NEG

-
+
@@ -2578,7 +2578,7 @@ to NaN.

FLOAT_ABS

-
+
@@ -2621,7 +2621,7 @@ to NaN.

FLOAT_SQRT

-
+
@@ -2664,7 +2664,7 @@ to NaN.

FLOAT_CEIL

-
+
@@ -2709,7 +2709,7 @@ to NaN.

FLOAT_FLOOR

-
+
@@ -2756,7 +2756,7 @@ to NaN.

FLOAT_ROUND

-
+
@@ -2803,7 +2803,7 @@ to NaN.

FLOAT_NAN

-
+
@@ -2845,7 +2845,7 @@ size 1, and input0 can be any size.

INT2FLOAT

-
+
@@ -2889,7 +2889,7 @@ precision.

FLOAT2FLOAT

-
+
@@ -2935,7 +2935,7 @@ to NaN.

TRUNC

-
+
diff --git a/GhidraDocs/languages/html/pcoderef.html b/GhidraDocs/languages/html/pcoderef.html index 6942d50778..255621d35b 100644 --- a/GhidraDocs/languages/html/pcoderef.html +++ b/GhidraDocs/languages/html/pcoderef.html @@ -4,7 +4,7 @@ P-Code Reference Manual - + @@ -25,13 +25,13 @@

-P-Code Reference Manual

+P-Code Reference Manual

Last updated September 5, 2019


-
+
@@ -215,7 +215,7 @@ The core concepts of p-code are:

-Address Space

+Address Space

The address space for p-code is a generalization of RAM. It is defined simply as an indexed sequence of bytes that can @@ -256,7 +256,7 @@ any of the other p-code operations.

-Varnode

+Varnode

A varnode is a generalization of either a register or a memory location. It is represented by the formal triple: @@ -303,7 +303,7 @@ on them by the p-code operations that use them.

-P-code Operation

+P-code Operation

A p-code operation is the analog of a machine instruction. All p-code operations have the same basic format diff --git a/GhidraDocs/languages/html/pseudo-ops.html b/GhidraDocs/languages/html/pseudo-ops.html index ed99250faa..a95c6d6716 100644 --- a/GhidraDocs/languages/html/pseudo-ops.html +++ b/GhidraDocs/languages/html/pseudo-ops.html @@ -4,7 +4,7 @@ Pseudo P-CODE Operations - + @@ -40,7 +40,7 @@ placed on other p-code operations that all effects must be explicit.

USERDEFINED

-
+
@@ -112,7 +112,7 @@ still have normal data-flow and can be manipulated symbolically.

CPOOLREF

-
+
@@ -174,7 +174,7 @@ of emulation and analysis, are necessarily architecture dependent.

NEW

-
+
diff --git a/GhidraDocs/languages/html/reference.html b/GhidraDocs/languages/html/reference.html index 4711150020..9b694c1549 100644 --- a/GhidraDocs/languages/html/reference.html +++ b/GhidraDocs/languages/html/reference.html @@ -4,7 +4,7 @@ Syntax Reference - + @@ -26,7 +26,7 @@

Syntax Reference

-
+
@@ -45,7 +45,7 @@
LOAD
- +
@@ -68,7 +68,7 @@
* v1
STORE
- +
@@ -153,7 +153,7 @@
*v0 = v1;
INT_LESS
- +
@@ -169,7 +169,7 @@
v0 < v1
INT_SLESS
- +
@@ -185,7 +185,7 @@
v0 s< v1
INT_LESSEQUAL
- +
@@ -201,7 +201,7 @@
v0 <= v1
INT_SLESSEQUAL
- +
@@ -347,7 +347,7 @@
v0 s<= v1
FLOAT_LESS
- +
@@ -363,7 +363,7 @@
v0 f< v1
FLOAT_LESSEQUAL
- +
@@ -454,7 +454,7 @@
v0 f<= v1
NEW
- +
diff --git a/GhidraDocs/languages/html/sleigh.html b/GhidraDocs/languages/html/sleigh.html index a02b507fe4..aede7a2eb4 100644 --- a/GhidraDocs/languages/html/sleigh.html +++ b/GhidraDocs/languages/html/sleigh.html @@ -4,7 +4,7 @@ SLEIGH - + @@ -25,9 +25,9 @@

-SLEIGH

+SLEIGH

A Language for Rapid Processor Specification

-

Last updated October 28, 2020

+

Last updated August 24, 2022

Originally published December 16, 2005


@@ -35,51 +35,51 @@

Table of Contents

-
1. Introduction to P-Code
+
1. Introduction to P-Code
-
1.1. Address Spaces
+
1.1. Address Spaces
1.2. Varnodes
-
1.3. Operations
+
1.3. Operations
2. Basic Specification Layout
-
2.1. Comments
-
2.2. Identifiers
-
2.3. Strings
-
2.4. Integers
-
2.5. White Space
+
2.1. Comments
+
2.2. Identifiers
+
2.3. Strings
+
2.4. Integers
+
2.5. White Space
3. Preprocessing
3.1. Including Files
-
3.2. Preprocessor Macros
-
3.3. Conditional Compilation
+
3.2. Preprocessor Macros
+
3.3. Conditional Compilation
4. Basic Definitions
4.1. Endianess Definition
-
4.2. Alignment Definition
-
4.3. Space Definitions
+
4.2. Alignment Definition
+
4.3. Space Definitions
4.4. Naming Registers
-
4.5. Bit Range Registers
-
4.6. User-Defined Operations
+
4.5. Bit Range Registers
+
4.6. User-Defined Operations
5. Introduction to Symbols
-
5.1. Notes on Namespaces
+
5.1. Notes on Namespaces
5.2. Predefined Symbols
6. Tokens and Fields
6.1. Defining Tokens and Fields
-
6.2. Fields as Family Symbols
-
6.3. Attaching Alternate Meanings to Fields
+
6.2. Fields as Family Symbols
+
6.3. Attaching Alternate Meanings to Fields
6.4. Context Variables
7. Constructors
-
7.1. The Five Sections of a Constructor
-
7.2. The Table Header
+
7.1. The Five Sections of a Constructor
+
7.2. The Table Header
7.3. The Display Section
7.4. The Bit Pattern Section
7.5. Disassembly Actions Section
@@ -87,12 +87,12 @@
7.7. The Semantic Section
7.8. Tables
7.9. P-code Macros
-
7.10. Build Directives
-
7.11. Delay Slot Directives
+
7.10. Build Directives
+
7.11. Delay Slot Directives
8. Using Context
-
8.1. Basic Use of Context Variables
+
8.1. Basic Use of Context Variables
8.2. Local Context Change
8.3. Global Context Change
@@ -101,7 +101,7 @@

-History

+History

This document describes the syntax for the SLEIGH processor specification language, which was developed for the GHIDRA @@ -129,7 +129,7 @@

-Overview

+Overview

SLEIGH is a language for describing the instruction sets of general purpose microprocessors, in order to facilitate the reverse @@ -162,7 +162,7 @@ Italics are used when defining terms and for named entities. Bold is used for SL

-1. Introduction to P-Code

+1. Introduction to P-Code

Although p-code is a distinct language from SLEIGH, because a major purpose of SLEIGH is to specify the translation from machine code to @@ -221,7 +221,7 @@ respectively.

-1.1. Address Spaces

+1.1. Address Spaces

An address space for p-code is a generalization of the indexed memory (RAM) that a typical processor has access to, and @@ -322,7 +322,7 @@ must be provided and enforced by the specification designer.

-1.3. Operations

+1.3. Operations

P-code is intended to emulate a target processor by substituting a sequence of p-code operations for each machine instruction. Thus every @@ -353,7 +353,7 @@ general purpose processor instruction sets. They break up into groups.

Table 1. P-code Operations

-
newobject(v0)
+
diff --git a/GhidraDocs/languages/html/sleigh_constructors.html b/GhidraDocs/languages/html/sleigh_constructors.html index 21c175f0fd..a0b5172687 100644 --- a/GhidraDocs/languages/html/sleigh_constructors.html +++ b/GhidraDocs/languages/html/sleigh_constructors.html @@ -4,7 +4,7 @@ 7. Constructors - + @@ -60,7 +60,7 @@ multiple constructors into a single table are addressed in

-7.1. The Five Sections of a Constructor

+7.1. The Five Sections of a Constructor

A single complex statement in the specification file describes a constructor. This statement is always made up of five distinct @@ -92,7 +92,7 @@ in turn.

-7.2. The Table Header

+7.2. The Table Header

Every constructor must be part of a table, which is the element with an actual family symbol identifier associated with it. So each @@ -230,7 +230,7 @@ no such requirement.

-7.3.2. The '^' character

+7.3.2. The '^' character

The ‘^’ character in the display section is used to separate identifiers from other characters where there shouldn’t be white space @@ -278,7 +278,7 @@ to match the constructor being defined.

-7.4.1. Constraints

+7.4.1. Constraints

The patterns required for processor specifications can almost always be described as a mask and value pair. Given a specific instruction @@ -337,7 +337,7 @@ requires two or more mask/value style checks to correctly implement.

-7.4.3. Defining Operands and Invoking Subtables

+7.4.3. Defining Operands and Invoking Subtables

The principle way of defining a constructor operand, left undefined from the display section, is done in the bit pattern section. If an @@ -396,7 +396,7 @@ statement of the grouping of old symbols into the new constructor.

-7.4.4. Variable Length Instructions

+7.4.4. Variable Length Instructions

There are some additional complexities to designing a specification for a processor with variable length instructions. Some initial @@ -419,7 +419,7 @@ designer control over how tokens fit together.

-7.4.4.1. The ';' Operator
+7.4.4.1. The ';' Operator

The most important operator for patterns defining variable length instructions is the concatenation operator ‘;’. When building a @@ -481,7 +481,7 @@ operator, so parentheses may be necessary to get the intended meaning.

-7.4.4.2. The '...' Operator
+7.4.4.2. The '...' Operator

The ellipsis operator ‘...’ is used to satisfy the token matching requirements of the ‘&’ and ‘|’ operators (described in the previous @@ -557,7 +557,7 @@ don’t quite match the assembly.

-7.4.6. Empty Patterns

+7.4.6. Empty Patterns

Occasionally there is a need for an empty pattern when building tables. An empty pattern matches everything. There is a predefined @@ -567,7 +567,7 @@ to indicate an empty pattern.

-7.4.7. Advanced Constraints

+7.4.7. Advanced Constraints

A constraint does not have to be of the form “field = constant”, although this is almost always what is needed. In certain situations, @@ -593,7 +593,7 @@ the following:

Table 3. Constraint Operators

-
+
@@ -720,7 +720,7 @@ is built up out of the following typical operators:

Table 4. Pattern Expression Operators

-
+
@@ -756,7 +756,7 @@ is built up out of the following typical operators:
Bitwise and
- +
@@ -771,7 +771,7 @@ is built up out of the following typical operators:
$and
Bitwise or
- +
@@ -786,7 +786,7 @@ is built up out of the following typical operators:
$or
Bitwise xor
- +
@@ -939,7 +939,7 @@ varnode is r1.

-7.7.1. Expressions

+7.7.1. Expressions

Expressions are built out of symbols and the binary and unary operators listed in Table 5, “Semantic Expression Operators and Syntax” in the @@ -954,7 +954,7 @@ within expressions to affect this order.

-7.7.1.1. Arithmetic, Logical and Boolean Operators
+7.7.1.1. Arithmetic, Logical and Boolean Operators

For the most part these operators should be familiar to software developers. The only real differences arise from the fact that @@ -1017,7 +1017,7 @@ set to something other than one.

-7.7.1.3. Extension
+7.7.1.3. Extension

Most processors have instructions that extend small values into big values, and many instructions do these minor data manipulations @@ -1039,7 +1039,7 @@ the sext operator.

-7.7.1.4. Truncation
+7.7.1.4. Truncation

There are two forms of syntax indicating a truncation of the input varnode. In one the varnode is followed by a colon ‘:’ and an integer @@ -1119,7 +1119,7 @@ these are automatically set to zero.

This operator can also be used on the left-hand side of assignments -with similar behavior and caveats (see Section 7.7.2.7, “Bit Range Assignments”). +with similar behavior and caveats (see Section 7.7.2.8, “Bit Range Assignments”).

@@ -1169,7 +1169,7 @@ the offset portion of the address, and to copy the desired value, the
-7.7.1.7. Managed Code Operations
+7.7.1.7. Managed Code Operations

SLEIGH provides basic support for instructions where encoding and context don't provide a complete description of the semantics. This is the case @@ -1231,7 +1231,7 @@ define pcodeop arctan;

-7.7.2. Statements

+7.7.2. Statements

We describe the types of semantic statements that are allowed in SLEIGH.

@@ -1305,7 +1305,7 @@ and may be enforced in future compiler versions.
-7.7.2.2. Storage Statements
+7.7.2.2. Storage Statements

SLEIGH supports fairly standard storage statement syntax to complement the load operator. The left-hand side of an @@ -1336,7 +1336,7 @@ attribute is set to something other than one.

-7.7.2.3. Exports
+7.7.2.3. Exports

The semantic section doesn’t just specify how to generate p-code for a constructor. Except for those constructors in the root table, this @@ -1388,7 +1388,7 @@ varnode being modified to be exported as an integer constant.

-7.7.2.4. Dynamic References
+7.7.2.4. Dynamic References

The only other operator allowed as part of an export statement, is the ‘*’ @@ -1447,7 +1447,7 @@ levels.

-7.7.2.5. Branching Statements
+7.7.2.5. Branching Statements

This section discusses statements that generate p-code branching operations. These are listed in Table 7, “Branching Statements”, in the Appendix. @@ -1677,7 +1677,28 @@ or CALL operation.

-7.7.2.7. Bit Range Assignments
+7.7.2.7. Skip Instruction Branching
+

+Many processors have a conditional-skip-instruction which must branch over the next instruction +based upon some condition. The inst_next2 symbol has been provided for +this purpose. +

+
+:skip.eq is opcode=10 {
+    if (zeroflag!=0) goto inst_next2;
+}
+
+

+

+

+In the example above, the branch address will be determined by adding the parsed-length of the next +instruction to the value of inst_next causing a branch over the next +instruction when the condition is satisfied. +

+ +
+
+7.7.2.8. Bit Range Assignments

The bit range operator can appear on the left-hand side of an assignment. But as with the ‘*’ operator, its meaning is slightly @@ -1802,7 +1823,7 @@ each followed by a variation which corrects the error.

-7.7.4. Unimplemented Semantics

+7.7.4. Unimplemented Semantics

The semantic section must be present for every constructor in the specification. But the designer can leave the semantics explicitly @@ -1962,7 +1983,7 @@ should generally be avoided.

-7.8.2. Specific Symbol Trees

+7.8.2. Specific Symbol Trees

When the SLEIGH parser analyzes an instruction, it starts with the root symbol instruction, and decides which of the @@ -2045,7 +2066,7 @@ and p-code for these encodings by walking the trees.

-7.8.2.1. Disassembly Trees
+7.8.2.1. Disassembly Trees

If the nodes of each tree are replaced with the display information of the corresponding specific symbol, we see how the disassembly @@ -2068,7 +2089,7 @@ statements corresponding to the original instruction encodings.

-7.8.2.2. P-code Trees
+7.8.2.2. P-code Trees

A similar procedure produces the resulting p-code translation of the instruction. If each node in the specific symbol tree is replaced with @@ -2147,7 +2168,7 @@ directive however should not be used in a macro.

-7.10. Build Directives

+7.10. Build Directives

Because the nodes of a specific symbol tree are traversed in a depth-first order, the p-code for a child node in general comes before @@ -2202,7 +2223,7 @@ normal action of the instruction.

-7.11. Delay Slot Directives

+7.11. Delay Slot Directives

For processors with a pipe-lined architecture, multiple instructions are typically executing simultaneously. This can lead to processor @@ -2245,7 +2266,8 @@ by the condition.

Because the delayslot directive combines two or more instructions into one, the meaning of the -symbol inst_next becomes ambiguous. It is not +symbols inst_next and inst_next2 +become ambiguous. It is not clear anymore what exactly the “next instruction” is. SLEIGH uses the following conventions for interpreting an inst_next symbol. If it is used in the @@ -2253,7 +2275,12 @@ semantic section, the symbol refers to the address of the instruction after any instructions in the delay slot. However, if it is used in a disassembly action, the inst_next symbol refers to the address of the instruction immediately after the first -instruction, even if there is a delay slot. +instruction, even if there is a delay slot. The use of the +inst_next2 symbol may be inappropriate in conjunction +with delayslot use. While its use of the +next instruction address is identified by inst_next, +the length of the next instruction ignores any delay slots it may have +when computing the value of inst_next2.

diff --git a/GhidraDocs/languages/html/sleigh_context.html b/GhidraDocs/languages/html/sleigh_context.html index ec56ddae6f..f81ef1e33c 100644 --- a/GhidraDocs/languages/html/sleigh_context.html +++ b/GhidraDocs/languages/html/sleigh_context.html @@ -4,7 +4,7 @@ 8. Using Context - + @@ -85,7 +85,7 @@ whose encodings are otherwise the same.

-8.1. Basic Use of Context Variables

+8.1. Basic Use of Context Variables

Suppose a processor supports the use of two different sets of registers in its main addressing mode, based on the setting of a @@ -100,7 +100,7 @@ define space ram type=ram_space size=4 default; define space register type=register_space size=4; define register offset=0 size=4 [ r0 r1 r2 r3 r4 r5 r6 r7 ]; define register offset=0x100 size=4 [ s0 s1 s2 s3 s4 s5 s6 s7 ]; -define register offset=0x200 size=4 [ contextreg ]; # define context bits (if defined, size must be multiple of 4-bytes) +define register offset=0x200 size=4 [ statusreg ]; # define context bits (if defined, size must be multiple of 4-bytes) define token instr(16) op=(10,15) rreg1=(7,9) sreg1=(7,9) imm=(0,6) diff --git a/GhidraDocs/languages/html/sleigh_definitions.html b/GhidraDocs/languages/html/sleigh_definitions.html index 96265a83e0..35518b8016 100644 --- a/GhidraDocs/languages/html/sleigh_definitions.html +++ b/GhidraDocs/languages/html/sleigh_definitions.html @@ -4,7 +4,7 @@ 4. Basic Definitions - + @@ -56,7 +56,7 @@ otherwise the specification language hides endianess issues.

-4.2. Alignment Definition

+4.2. Alignment Definition

An alignment definition looks like

@@ -73,7 +73,7 @@ instruction as an error.

-4.3. Space Definitions

+4.3. Space Definitions

The definition of an address space looks like

@@ -228,7 +228,7 @@ define register offset=0 size=1

-4.5. Bit Range Registers

+4.5. Bit Range Registers

Many processors define registers that either consist of a single bit or otherwise don't use an integral number of bytes. A recurring @@ -299,7 +299,7 @@ used as an alternate syntax for defining overlapping registers.

-4.6. User-Defined Operations

+4.6. User-Defined Operations

The specification designer can define new p-code operations using a define pcodeop statement. This diff --git a/GhidraDocs/languages/html/sleigh_layout.html b/GhidraDocs/languages/html/sleigh_layout.html index 8b641bacdf..56a4acb225 100644 --- a/GhidraDocs/languages/html/sleigh_layout.html +++ b/GhidraDocs/languages/html/sleigh_layout.html @@ -4,7 +4,7 @@ 2. Basic Specification Layout - + @@ -36,7 +36,7 @@ by the compiler.

-2.1. Comments

+2.1. Comments

Comments start with the ‘#’ character and continue to the end of the line. Comments can appear anywhere except the display section of a @@ -46,7 +46,7 @@ interpreted as something that should be printed in disassembly.

-2.2. Identifiers

+2.2. Identifiers

Identifiers are made up of letters a-z, capitals A-Z, digits 0-9 and the characters ‘.’ and ‘_’. An identifier can use these characters in @@ -55,7 +55,7 @@ any order and for any length, but it must not start with a digit.

-2.3. Strings

+2.3. Strings

String literals can be used, when specifying names and when specifying how disassembly should be printed, so that special characters are @@ -66,7 +66,7 @@ meaning.

-2.4. Integers

+2.4. Integers

Integers are specified either in a decimal format or in a standard C-style hexadecimal format by prepending the @@ -92,7 +92,7 @@ integers internally with 64 bits of precision.

-2.5. White Space

+2.5. White Space

White space characters include space, tab, line-feed, vertical line-feed, and carriage-return (‘ ‘, ‘\t’, ‘\r’, ‘\v’, diff --git a/GhidraDocs/languages/html/sleigh_preprocessing.html b/GhidraDocs/languages/html/sleigh_preprocessing.html index 5f47bc64bc..23ecfe588d 100644 --- a/GhidraDocs/languages/html/sleigh_preprocessing.html +++ b/GhidraDocs/languages/html/sleigh_preprocessing.html @@ -4,7 +4,7 @@ 3. Preprocessing - + @@ -54,7 +54,7 @@ own @include directives.

-3.2. Preprocessor Macros

+3.2. Preprocessor Macros

SLEIGH allows simple (unparameterized) macro definitions and expansions. A macro definition occurs on one line and starts with @@ -85,7 +85,7 @@ definition of a macro from that point on in the file.

-3.3. Conditional Compilation

+3.3. Conditional Compilation

SLEIGH supports several directives that allow conditional inclusion of parts of a specification, based on the existence of a macro, or its @@ -103,7 +103,7 @@ and @endif.

-3.3.1. @ifdef and @ifndef

+3.3.1. @ifdef and @ifndef

The @ifdef directive is followed by a macro identifier and evaluates to true if the macro is defined. @@ -129,7 +129,7 @@ or @elif directive (See below).

-3.3.2. @if

+3.3.2. @if

The @if directive is followed by a boolean expression with macros as the variables and strings as the @@ -158,7 +158,7 @@ is defined.

-3.3.3. @else and @elif

+3.3.3. @else and @elif

An @else directive splits the lines bounded by an @if directive and diff --git a/GhidraDocs/languages/html/sleigh_ref.html b/GhidraDocs/languages/html/sleigh_ref.html index d2a54cd534..4914495b49 100644 --- a/GhidraDocs/languages/html/sleigh_ref.html +++ b/GhidraDocs/languages/html/sleigh_ref.html @@ -4,7 +4,7 @@ 9. P-code Tables - + @@ -47,7 +47,7 @@ to lowest.

Table 5. Semantic Expression Operators and Syntax

-
$xor
+
@@ -61,7 +61,7 @@ to lowest.
SUBPIECE
- +
@@ -98,7 +98,7 @@ to lowest.
v0:2
LOAD
- +
@@ -214,7 +214,7 @@ to lowest.
* v1
INT_SLESS
- +
@@ -230,7 +230,7 @@ to lowest.
v0 s< v1
INT_SLESSEQUAL
- +
@@ -246,7 +246,7 @@ to lowest.
v0 s<= v1
INT_LESS
- +
@@ -262,7 +262,7 @@ to lowest.
v0 < v1
INT_LESSEQUAL
- +
@@ -278,7 +278,7 @@ to lowest.
v0 <= v1
FLOAT_LESS
- +
@@ -294,7 +294,7 @@ to lowest.
v0 f< v1
FLOAT_LESSEQUAL
- +
@@ -454,7 +454,7 @@ The following table lists the basic forms of a semantic statement.

Table 6. Basic Statements and Associated Operators

-
v0 f<= v1
+
@@ -473,7 +473,7 @@ The following table lists the basic forms of a semantic statement.
STORE
- +
@@ -533,7 +533,7 @@ The following table lists the branching operations and the statements which invo

Table 7. Branching Statements

-
*v0 = v1
+
diff --git a/GhidraDocs/languages/html/sleigh_symbols.html b/GhidraDocs/languages/html/sleigh_symbols.html index a3ab15203c..f1915438ba 100644 --- a/GhidraDocs/languages/html/sleigh_symbols.html +++ b/GhidraDocs/languages/html/sleigh_symbols.html @@ -4,7 +4,7 @@ 5. Introduction to Symbols - + @@ -105,7 +105,7 @@ the predefined identifier instruction.

-5.1. Notes on Namespaces

+5.1. Notes on Namespaces

Almost all identifiers live in the same global "scope". The global scope includes

@@ -150,7 +150,7 @@ We list all of the symbols that are predefined by SLEIGH.

Table 2. Predefined Symbols

-
+
@@ -178,6 +178,10 @@ We list all of the symbols that are predefined by SLEIGH. + + + + @@ -194,7 +198,8 @@ and inst_next. These are family symbols w in the context of particular instruction to the integer offset of either the address of the instruction or the address of the next instruction respectively. These are used in any relative branching -situation. The other symbols are rarely +situation. The inst_next2 is intended for conditional +skip instruction situations. The remaining symbols are rarely used. The const and unique identifiers are address spaces. The epsilon identifier is inherited from SLED and is a specific symbol equivalent diff --git a/GhidraDocs/languages/html/sleigh_tokens.html b/GhidraDocs/languages/html/sleigh_tokens.html index dc572dfdb4..1ba4902e6e 100644 --- a/GhidraDocs/languages/html/sleigh_tokens.html +++ b/GhidraDocs/languages/html/sleigh_tokens.html @@ -4,7 +4,7 @@ 6. Tokens and Fields - + @@ -88,7 +88,7 @@ different names.

-6.2. Fields as Family Symbols

+6.2. Fields as Family Symbols

Fields are the most basic form of family symbol; they define a natural map from instruction bits to a specific symbol as follows. We take the @@ -113,7 +113,7 @@ the dec attribute is not supported]

-6.3. Attaching Alternate Meanings to Fields

+6.3. Attaching Alternate Meanings to Fields

The default interpretation of a field is probably the most natural but of course processors interpret fields within an instruction in a wide @@ -124,7 +124,7 @@ interpretations must be built up out of tables.

-6.3.1. Attaching Registers

+6.3.1. Attaching Registers

Probably the most common processor interpretation of a field is as an encoding of a particular register. In SLEIGH this @@ -163,7 +163,7 @@ of the instruction.

-6.3.2. Attaching Other Integers

+6.3.2. Attaching Other Integers

Sometimes a processor interprets a field as an integer but not the integer given by the default interpretation. A different integer @@ -185,7 +185,7 @@ unspecified positions in the list using a ‘_’]

-6.3.3. Attaching Names

+6.3.3. Attaching Names

It is possible to just modify the display characteristics of a field without changing the semantic meaning. The need for this is rare, but

inst_next Offset of the address of the next instruction.
inst_next2Offset of the address of the instruction after the next instruction.
epsilon A special identifier indicating an empty bit pattern.