OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can be | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 /* nc_inst_iter_inl.c - Holds inline routines for commonly used (simple) | |
8 * functions in nc_inst_iter.h. Used to speed up code. Inline routines | |
9 * correspond to the following functions in nc_inst_iter.h, but with | |
10 * an 'Inline' suffix: | |
11 * | |
12 * NaClInstIterGetState | |
13 * NaClInstIterGetLookbackState | |
14 * NaClInstIterHasLookbackState | |
15 * NaClInstIterHasNext | |
16 * NaClInstIterAdvance | |
17 * NaClInstIterGetInstMemory | |
18 */ | |
19 | |
20 #ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NC_INST_ITER_INL_h_ | |
21 #define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NC_INST_ITER_INL_h_ | |
22 | |
23 #include <assert.h> | |
24 | |
25 #include "native_client/src/trusted/validator/x86/decoder/nc_inst_iter.h" | |
26 #include "native_client/src/trusted/validator/x86/decoder/nc_inst_state.h" | |
27 #include "native_client/src/trusted/validator/x86/decoder/nc_inst_state_internal
.h" | |
28 #include "native_client/src/trusted/validator/x86/nc_segment.h" | |
29 | |
30 /* Default handler for errors while running instruction iterator. | |
31 * Should only be called when caller has incorrectly called a | |
32 * method. | |
33 */ | |
34 void NaClInstIterFatal(const char* error_message); | |
35 | |
36 static INLINE NaClInstState* NaClInstIterGetUndecodedStateInline( | |
37 NaClInstIter* iter) { | |
38 return &iter->buffer[iter->buffer_index]; | |
39 } | |
40 | |
41 static INLINE NaClInstState* NaClInstIterGetStateInline(NaClInstIter* iter) { | |
42 NaClInstState* state = NaClInstIterGetUndecodedStateInline(iter); | |
43 if (NULL == state->inst) { | |
44 NaClDecodeInst(iter, state); | |
45 } | |
46 return state; | |
47 } | |
48 | |
49 static INLINE NaClInstState* NaClInstIterGetLookbackStateInline( | |
50 NaClInstIter* iter, size_t distance) { | |
51 NaClInstState* state; | |
52 assert(distance < iter->buffer_size); | |
53 assert(distance <= iter->inst_count); | |
54 state = &iter->buffer[((iter->buffer_index + iter->buffer_size) - distance) | |
55 % iter->buffer_size]; | |
56 if (NULL == state->inst) { | |
57 NaClDecodeInst(iter, state); | |
58 } | |
59 return state; | |
60 } | |
61 | |
62 static INLINE Bool NaClInstIterHasLookbackStateInline( | |
63 NaClInstIter* iter, size_t distance) { | |
64 return distance < iter->buffer_size && distance <= iter->inst_count; | |
65 } | |
66 | |
67 static INLINE Bool NaClInstIterHasNextInline(NaClInstIter* iter) { | |
68 /* | |
69 DEBUG(NaClLog(LOG_INFO, "iter has next index %"NACL_PRIxNaClMemorySize | |
70 " < %"NACL_PRIxNaClMemorySize"\n", | |
71 iter->index, iter->segment->size)); | |
72 */ | |
73 return iter->index < iter->segment->size; | |
74 } | |
75 | |
76 static INLINE void NaClInstIterAdvanceInline(NaClInstIter* iter) { | |
77 if (iter->index >= iter->segment->size) { | |
78 NaClInstIterFatal("NaClInstIterAdvance with no next element."); | |
79 } | |
80 NaClInstIterGetStateInline(iter); | |
81 iter->index += iter->memory.read_length; | |
82 ++iter->inst_count; | |
83 iter->buffer_index = (iter->buffer_index + 1) % iter->buffer_size; | |
84 /* | |
85 DEBUG( | |
86 NaClLog(LOG_INFO, | |
87 "iter advance: index %"NACL_PRIxNaClMemorySize", " | |
88 "buffer index %"NACL_PRIuS"\n", | |
89 iter->index, iter->buffer_index)); | |
90 */ | |
91 iter->buffer[iter->buffer_index].inst = NULL; | |
92 } | |
93 | |
94 static INLINE uint8_t* NaClInstIterGetInstMemoryInline(NaClInstIter* iter) { | |
95 if (iter->index >= iter->segment->size) { | |
96 NaClInstIterFatal("NaClInstIterGetInstMemory with no next element."); | |
97 } | |
98 return iter->segment->mbase + iter->index; | |
99 } | |
100 | |
101 #endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_DECODER_NC_INST_ITER_INL_h_ */ | |
OLD | NEW |