annotate src/os/bsd/vm/decoder_machO.cpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents b9a9ed0f8eeb
children 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
1 /*
6842
b9a9ed0f8eeb 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 6258
diff changeset
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
4 *
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
8 *
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
13 * accompanied this code).
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
14 *
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
18 *
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
21 * questions.
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
22 *
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
23 */
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
24
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
25 #include "precompiled.hpp"
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
26
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
27 #ifdef __APPLE__
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
28 #include "decoder_machO.hpp"
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
29
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
30 #include <cxxabi.h>
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
31 #include <mach-o/loader.h>
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
32 #include <mach-o/nlist.h>
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
33
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
34
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
35 bool MachODecoder::demangle(const char* symbol, char *buf, int buflen) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
36 int status;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
37 char* result;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
38 size_t size = (size_t)buflen;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
39 // Don't pass buf to __cxa_demangle. In case of the 'buf' is too small,
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
40 // __cxa_demangle will call system "realloc" for additional memory, which
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
41 // may use different malloc/realloc mechanism that allocates 'buf'.
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
42 if ((result = abi::__cxa_demangle(symbol, NULL, NULL, &status)) != NULL) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
43 jio_snprintf(buf, buflen, "%s", result);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
44 // call c library's free
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
45 ::free(result);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
46 return true;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
47 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
48 return false;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
49 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
50
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
51 bool MachODecoder::decode(address addr, char *buf,
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
52 int buflen, int *offset, const void *mach_base) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
53 struct symtab_command * symt = (struct symtab_command *)
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
54 mach_find_command((struct mach_header_64 *)mach_base, LC_SYMTAB);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
55 if (symt == NULL) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
56 DEBUG_ONLY(tty->print_cr("no symtab in mach file at 0x%lx", mach_base));
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
57 return false;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
58 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
59 uint32_t off = symt->symoff; /* symbol table offset (within this mach file) */
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
60 uint32_t nsyms = symt->nsyms; /* number of symbol table entries */
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
61 uint32_t stroff = symt->stroff; /* string table offset */
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
62 uint32_t strsize = symt->strsize; /* string table size in bytes */
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
63
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
64 // iterate through symbol table trying to match our offset
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
65
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
66 uint32_t addr_relative = (uintptr_t) mach_base - (uintptr_t) addr; // offset we seek in the symtab
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
67 void * symtab_addr = (void*) ((uintptr_t) mach_base + off);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
68 struct nlist_64 *cur_nlist = (struct nlist_64 *) symtab_addr;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
69 struct nlist_64 *last_nlist = cur_nlist; // no size stored in an entry, so keep previously seen nlist
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
70
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
71 int32_t found_strx = 0;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
72 int32_t found_symval = 0;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
73
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
74 for (uint32_t i=0; i < nsyms; i++) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
75 uint32_t this_value = cur_nlist->n_value;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
76
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
77 if (addr_relative == this_value) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
78 found_strx = cur_nlist->n_un.n_strx;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
79 found_symval = this_value;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
80 break;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
81 } else if (addr_relative > this_value) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
82 // gone past it, use previously seen nlist:
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
83 found_strx = last_nlist->n_un.n_strx;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
84 found_symval = last_nlist->n_value;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
85 break;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
86 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
87 last_nlist = cur_nlist;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
88 cur_nlist = cur_nlist + sizeof(struct nlist_64);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
89 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
90 if (found_strx == 0) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
91 return false;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
92 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
93 // write the offset:
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
94 *offset = addr_relative - found_symval;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
95
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
96 // lookup found_strx in the string table
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
97 char * symname = mach_find_in_stringtable((char*) ((uintptr_t)mach_base + stroff), strsize, found_strx);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
98 if (symname) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
99 strncpy(buf, symname, buflen);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
100 return true;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
101 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
102 DEBUG_ONLY(tty->print_cr("no string or null string found."));
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
103 return false;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
104 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
105
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
106 void* MachODecoder::mach_find_command(struct mach_header_64 * mach_base, uint32_t command_wanted) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
107 // possibly verify it is a mach_header, use magic number.
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
108 // commands begin immediately after the header.
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
109 struct load_command *pos = (struct load_command *) mach_base + sizeof(struct mach_header_64);
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
110 for (uint32_t i = 0; i < mach_base->ncmds; i++) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
111 struct load_command *this_cmd = (struct load_command *) pos;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
112 if (this_cmd->cmd == command_wanted) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
113 return pos;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
114 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
115 int cmdsize = this_cmd->cmdsize;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
116 pos += cmdsize;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
117 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
118 return NULL;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
119 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
120
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
121 char* MachODecoder::mach_find_in_stringtable(char *strtab, uint32_t tablesize, int strx_wanted) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
122
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
123 if (strx_wanted == 0) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
124 return NULL;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
125 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
126 char *strtab_end = strtab + tablesize;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
127
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
128 // find the first string, skip over the space char
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
129 // (or the four zero bytes we see e.g. in libclient)
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
130 if (*strtab == ' ') {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
131 strtab++;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
132 if (*strtab != 0) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
133 DEBUG_ONLY(tty->print_cr("string table has leading space but no following zero."));
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
134 return NULL;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
135 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
136 strtab++;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
137 } else {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
138 if ((uint32_t) *strtab != 0) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
139 DEBUG_ONLY(tty->print_cr("string table without leading space or leading int of zero."));
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
140 return NULL;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
141 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
142 strtab+=4;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
143 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
144 // read the real strings starting at index 1
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
145 int cur_strx = 1;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
146 while (strtab < strtab_end) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
147 if (cur_strx == strx_wanted) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
148 return strtab;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
149 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
150 // find start of next string
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
151 while (*strtab != 0) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
152 strtab++;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
153 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
154 strtab++; // skip the terminating zero
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
155 cur_strx++;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
156 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
157 DEBUG_ONLY(tty->print_cr("string number %d not found.", strx_wanted));
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
158 return NULL;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
159 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
160
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 4803
diff changeset
161
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
162 #endif
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
163
d7e3846464d0 7071311: Decoder enhancement
zgu
parents:
diff changeset
164