|
компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов
int t, int c) С помощью sym_push2() создается новый символ Переданный идентификатор проверяется на достижение границы SYM_FIRST_ANOM Обращаемся к соответсвующему элементу из table_ident и получаем ссылку на символ из поля sym_identifier; проходим по цепочке символо по полю prev_tok, пока не достигнем ее конца Помещаем наш символ в конец этой цепочки. Возвращаем адрес символа static void tok_str_add_tok(TokenString *s) При необходимости значение поля line_num сохранется в поле last_line_num перданного символа Впременная CValue с номером строки добавляетя символ с помощью tok_str_add2() Функция tok_str_add2() вызывается еще раз. Для добавления текущий значений токена и адреса tokc Глобальная переменная nocode_wanted сохраняется и сбрасывается в ноль Текущий указатель на данные обновляется значением поля data_offset текущей секции кода. Вызывается put_extern_sym(); Имя функции получается с помощью get_tok_str() Сохраняется текущий указатель на данные ind; Вызываеются sym_push2() и gfunc_prolog() Символ результата обнулятеся, вызывается block(); Вызываются gsym() и gfunc_epilog() Значение поля data_offset текущей секции кода обновляется текущим указателем на данные Вызываются label_pop() и sym_pop() Поле st_size элемента symtab_section соответствующего переданному символу обновляетя разностью текущего указателя на иснстукцию и ег сохраненной копии. Глобальная переменная имени функции сбрасывается в пустую строку. В поле t глобального типа возвращаемого значения записывается в VT_VOID. Указатель на данные сбрасываются в ноль. Переменная nocode_wanted восстанавливается void gfunc_prolog(CType *func_type) Сылка на символ поучается из поля ref переданного CType В найденном смволе поле r преобразовывается макросом FUNC_CALL к типу функции В зависимости от него выбираются значения для переменных fastcall_nb_regs и func_call Указатель на данные увеличивается на FUNC_PROLOG_SIZE; Это значение присваивается func_sub_sp_offset Переменная func_vt обновляется типом символа Если тип кодирует VT_STRUCT func_vc присваивается addr, сам addr увеличивается на 4, param_index увеличивается на 1 Присходит обход символов по цепочке next Переменной size присваивается результат вызова type_size() для типа текущего символа в цеочек. Значение size делается кратным 3 Если комписялор собран с опцией FUNC_STRUCT_PARAM_AS_PTR и тип кодирует VT_STRUCT, то переменной size присваивается 4; Если значение param_index меньше fastcall_nb_regs, переменная loc уменьшается на 4, вызывается o() с параметром 0x89 Вызывается gen_modrm(), param_addr присваивается значение переменной loc Если значение param_index больше или равно fastcall_nb_regs, param_addr присваивается значение addr, addr увеличивается на значение size; Вызывается sym_push(); Переменная param_index увеличивается на 1. Переменная func_ret_sub обнуляется. Если func_call равен FUNC_STDCALL, то переменной func_ret_sub присваивается значение addr уменьшенное на 8; Если установлен флаг do_bounds_check, дважды вызывается oad(), func_bound_offset присваивается указатель на данные секции lbounds_section |
|
|