This file is indexed.

/usr/include/fcml/fcml_assembler.h is in libfcml-dev 1.1.3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  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
 40
 41
 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
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 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
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*
 * FCML - Free Code Manipulation Library.
 * Copyright (C) 2010-2015 Slawomir Wojtasiak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

/** @file fcml_assembler.h
 * Structures and functions declarations related to one-line FCML assembler.
 * @copyright Copyright (C) 2010-2015 Slawomir Wojtasiak. All rights reserved.
 * This project is released under the GNU Lesser General Public License.
 */

#ifndef FCML_ASSEMBLER_H_
#define FCML_ASSEMBLER_H_

#include "fcml_lib_export.h"

#include "fcml_types.h"
#include "fcml_errors.h"
#include "fcml_common.h"
#include "fcml_dialect.h"
#include "fcml_optimizers.h"
#include "fcml_choosers.h"

#ifdef __cplusplus
extern "C" {
#endif

/** Abstract assembler representation. */
typedef struct fcml_st_assembler fcml_st_assembler;

/**
 * Assembler runtime configuration.
 */
typedef struct fcml_st_assembler_conf {
    /** Set to true in order to force assembler to increment IP address by length of the assembled instruction. */
    fcml_bool increment_ip;
    /** True if optional error and warning messages should be collected during processing. */
    fcml_bool enable_error_messages;
    /** If there are SIB and "ModR/M only" encodings available, choose the SIB based one. */
    fcml_bool choose_sib_encoding;
    /** If memory address can be encoded as relative or absolute value choose the absolute addressing. It works in 64 bit mode only. */
    fcml_bool choose_abs_encoding;
    /** Sometimes REX prefix is useless so it is just omitted in the final machine code. By setting this flag to true you can force this prefix to be added anyway. */
    fcml_bool force_rex_prefix;
    /** Every 2 byte VEX/XOP prefix can be encoded using three byte form. Setting this flag to true forces it. */
    fcml_bool force_three_byte_VEX;
    /** Optimizer implementation that should be used by assembler. Setting it to NULL causes assembler to use default one. */
    fcml_fnp_asm_optimizer optimizer;
    /** This field is passed to the chosen optimizer. It can be used to configure its behavior. */
    fcml_uint16_t optimizer_flags;
    /** instruction chooser implementation that should be used by assembler to choose most appropriate instruction encoding.
     * Setting this value to NULL cause assembler to use default instruction chooser. */
    fcml_fnp_asm_instruction_chooser chooser;
} fcml_st_assembler_conf;

/**
 * Encoded instruction.
 * Every instruction might be encoded to more than one binary form.
 * This chain holds all forms assembler was able to assemble instruction to.
 */
typedef struct fcml_st_assembled_instruction {
    /** Next assembled instruction in the chain. */
    struct fcml_st_assembled_instruction *next;
    /** Warning messages related to assembled instruction.*/
    fcml_st_ceh_error_container warnings;
    /** Instruction machine code.*/
    fcml_uint8_t *code;
    /** Instruction code length in bytes.*/
    fcml_usize code_length;
#ifdef FCML_DEBUG
    fcml_uint8_t __def_index;
#endif
} fcml_st_assembled_instruction;

/** Assembler result. */
typedef struct fcml_st_assembler_result {
    /** Error and warning messages from assembler.*/
    fcml_st_ceh_error_container errors;
    /** Chain of assembled instructions. */
    fcml_st_assembled_instruction *instructions;
    /** Instruction chosen by used instruction chooser; otherwise NULL.*/
    fcml_st_assembled_instruction *chosen_instruction;
    /** Number of encoded instruction forms. */
    fcml_usize number_of_instructions;
} fcml_st_assembler_result;

/** Assembler runtime context. */
typedef struct fcml_st_assembler_context {
    /** Assembler instance that should be used to assemble instructions. */
    fcml_st_assembler *assembler;
    /** Assembler behaviour can be configured here.*/
    fcml_st_assembler_conf configuration;
    /** Instruction entry point configuration. */
    fcml_st_entry_point entry_point;
} fcml_st_assembler_context;

/**
 * Initializes assembler for given dialect.
 * Initializes assembler instance for given dialect (Intel, AT&T). Assembler
 * initialized in such a way is dialect dependent and supports GIM with the
 * syntax supported by it. Every assembler instance has to be freed using
 * fcml_fn_assembler_free() function as soon as it is not needed anymore.
 *
 * @param dialect Dialect instance.
 * @param[out] assembler Initialized assembler instance.
 * @return Error code or FCML_CEH_GEC_NO_ERROR.
 * @see fcml_fn_assembler_free
 */
LIB_EXPORT fcml_ceh_error LIB_CALL fcml_fn_assembler_init( const fcml_st_dialect *dialect, fcml_st_assembler **assembler );

/**
 * Assembles one instruction encoded in the generic instruction model.
 * Instruction is proceeded using configuration and assembler provided
 * in given fcml_st_assembler_context instance. Assembled code as well
 * as potential errors or warnings are accessible via provided reusable
 * result holder instance. Result holder has to be allocated by the
 * user and appropriately prepared using fcml_fn_assembler_result_prepare()
 * function. As long as the instruction context and the result holder
 * are not shared across multiple function calls assembling process is
 * thread safe.
 *
 * @param context Assembler context (Assembler, Entry Point, Configuration).
 * @param instruction Instruction encoded as generic instruction model (Dialect dependent).
 * @param result Result holder (Remember to prepare it appropriately).
 * @return Error code or FCML_CEH_GEC_NO_ERROR.
 * @see fcml_fn_assembler_result_prepare fcml_fn_assembler_init
 */
LIB_EXPORT fcml_ceh_error LIB_CALL fcml_fn_assemble( fcml_st_assembler_context *context, const fcml_st_instruction *instruction,
        fcml_st_assembler_result *result );

/**
 * Prepares reusable result holder for assembler.
 * Every instance of fcml_st_assembler_result structure is reusable from the assembler's
 * point of view, so it has to be prepared in the right way in order to allow assembler to
 * reuse it correctly. It is up to the library user to allocate space for the holder itself.
 * This function is only responsible for cleaning the structure correctly and preparing it
 * for the first assembling process. Notice that assembler has to clean the result holder at the
 * beginning so you can not pass an uninitialized memory block because it can even cause
 * a crash due to illegal memory access.
 *
 * @param result Result holder instance to be prepared.
 */
LIB_EXPORT void LIB_CALL fcml_fn_assembler_result_prepare( fcml_st_assembler_result *result );

/**
 * Cleans result holder.
 * Frees all memory blocks allocated by the assembler and held inside the result holder (Instructions, errors etc.).
 * Notice that result holder itself is not freed and can be even safety reused after call to this function.
 * In fact this function is also called internally by the assembler in order to clean result holder before
 * reusing it.
 * @param result Result holder to clean.
 */
LIB_EXPORT void LIB_CALL fcml_fn_assembler_result_free( fcml_st_assembler_result *result );

/**
 * Frees assembled instruction.
 * Take into account that it does not free whole chain recursively but only the one instruction you have provided.
 * @param instruction Instruction to be freed.
 */
LIB_EXPORT void LIB_CALL fcml_fn_assembler_instruction_free( fcml_st_assembled_instruction *instruction );

/**
 * Detaches given instruction from the instructions chain.
 * Removes given assembled instruction from the provided chain in order
 * to prevent premature freeing of memory while assembler cleans result holder
 * reusing it. Detached instructions are not automatically deallocated by
 * fcml_fn_assemble() or fcml_fn_assembler_result_free() functions, so
 * it is up to you to free it using fcml_fn_assembler_instruction_free()
 * function when it is not needed anymore. Function may be useful
 * when you need to store assembled instructions across multiple calls
 * to the assembler if you reuse the same result holder. If there is only one
 * instruction in the chain its pointer will be set to NULL after detaching it.
 * @param chain Pointer to the instructions chain pointer.
 * @param instruction Instruction to be detached from the chain.
 *
 */
LIB_EXPORT void LIB_CALL fcml_fn_assembler_instruction_detach( fcml_st_assembled_instruction **chain, fcml_st_assembled_instruction *instruction );

/**
 * Frees assembler instance.
 * Every assembler instance manages some resources internally and as such it has
 * to be deallocated as soon as it is not needed anymore.
 * @param assembler Assembler to be freed.
 */
LIB_EXPORT void LIB_CALL fcml_fn_assembler_free( fcml_st_assembler *assembler );

#ifdef __cplusplus
}
#endif

#endif /* FCML_ASSEMBLER_H_ */