Главная страница

компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов


Скачать 191.99 Kb.
НазваниеTiny c compiler by Fabrice Bellard Описание алгоритмов
Анкоркомпилятор ТСС
Дата08.11.2019
Размер191.99 Kb.
Формат файлаodt
Имя файлаtcc book.odt
ТипДокументы
#94047
страница24 из 38
1   ...   20   21   22   23   24   25   26   27   ...   38
void vpushi(int v) В временном экземпляре CValue в поле i записывается переданное значение. Вызывается vsetc() void vsetc(CType *type, int r, CValue *vc) Цепочка vtop проверяестя на переполнение Если адрес конца цепочки vtop больше чем vstack Сохраняется биты поля r структуры SValue в конце vtop входящие в VT_VALMASK Если они кодируют VT_CMP или со сброшенным младшим битом значение кодирует VT_JMP, то вызывается gv() Конец цепочки vtop сдвигается. В новом SValue заполняются необходимые поля. static void gexpr(void) Начинается бесконечный цикл Вызывается expr_eq() Если текущий токен равен ',', цикл прекращается Вызываютс vpop() и next() int gtst(int inv, int t) Сохраняется биты поля r структуры SValue в конце vtop входящие в VT_VALMASK Если они кодируют VT_CMP вызывается g(), переменная t обновляется вызовом psym((vtop->c.i - 16) ^ inv, t), т. е. обертки над oad() Если кодируются VT_JMP или VT_JMPI Младший бит проверяется на равенство inv. Если они равны, Смещению p присваивается значения поле i структуры CType связанной с vtop Пока мы не встретим нулевого смещения, мы будем получать его из данных cur_text_section На место нулевого смещения записывается переданное значение (переменная t) Используем t чтобы сохранить поле i структуры CType связанной с vtop Если младший бит не равен inv, t обновляется вызовом gjmp(), gsym(vtop→ вызывается gsym(vtop->c.i); Если не кодируются ни VT_JMP ни VT_JMPI CType проверяется с помощью is_float(). Если эта проверка возвращает положительное значение или кодируется VT_LLONG, то вызываются, vpushi(0) и gen_op(TOK_NE); Если поля r структуры SValue в конце vtop кодирует VT_CONST, то поле i структуры CType связанной с vtop проверяется на равенстов нулю и результат проверяется на равенстов inv. Если проверки взвращают положитльный результат значение t обновляется вызовом gjmp() Если VT_CONST не кодируется, значение v обновляется вызоывом gv(RC_INT) Вызываются o(0x85), o(0xc0 + v * 9), g(0x0f). Значение t обновляется вызовом psym(0x85 ^ inv, t), т. е. обертки над oad() Цепочка vtop уменьшается. Фунция возврацает t int gv(int rc) Если CType связанной с vtop содержит биты входящие в маску VT_BITFIELD. То эти биты с помощью сдвига и обнуления лишних бит помещаются в bit_pos и bit_size В CType оставляются только биты не входящие в VT_BITFIELD Вызываются vpushi(), gen_op() и еще раз vpushi() и gen_op(). Значение r обновляется вызовом gv() Если предидущая проверка бит входящих в VT_BITFIELD вернула нулевое значение, происходит следующая обработка. Вызывается is_float() если она возвращает ненулевое значение и поле r структуры SValue в конце vtop кодирует VT_CONST, происходит следующая обработка. Вычисляется размер типа с помощью type_size() Вычисляется новое смещение с учетом выравнивания. Поле data_offset в секциии data_section обновляется вычисленным значением Если вычесленный размер типа равен 12, то в CValue обнуляются соответствующие биты. Значение ptr обновляется вызовом section_ptr_add(); Размер типа уменьшается в четыре раза. В цикле от нуля до значения размера обновляется значения по соответствующим адресам в секции. Значения берутся из массива tab, входящего в CValue Значение sym обновляется вызовом get_sym_ref(); Обновляются поля структуры SValue находящейся в конце цепочки vtop Значения r обновляется значением соответствующего поле SValue находящейся в конце цепочки vtop Берутся только биты входящие в VT_VALMASK Следующая обработка запистится в одном из следующих случиев. 1) Полученное значение больше чем VT_CONST 2) Поле r структуры SValue находящейся в конце цепочки vtop содержит биты входящие в маску VT_LVAL. 3) Вычесленное значение используется в качесве номера элемента в массиве reg_classes[]. Условие выполнится, если побитовое И соответствующего элемента и переданного значения дает нулевой результат. 4) Поле r2 структуры SValue находящейся в конце цепочки vtop используется в качесве номера элемента в массиве reg_classes[]. Условие выполнится, если побитовое И соответствующего элемента и переданного значения дает нулевой результат. При этом CType должен кодировать VT_LLONG Значение r обновляется вызовом get_reg(); Если CType кодирует VT_LLONG, происходит следующая обработка Поле r структуры SValue находящейся в конце цепочки vtop кодирует VT_CONST, происходит следующая обработка Значение ll обновляется значением поля ull структуры CValue Поле ui этой структуры обновляется значением ll Вызывается load() Поле r структуры SValue находящейся в конце цепочки vtop обновляется значением r Вызывается vpushi() Если VT_CONST не кодируется но при этом r больше или равно VT_CONST или Поле r структуры SValue содержит биты входящие в маску VT_LVAL, то происходит следующая обработка: Вызываются save_regs(), load(), vdup() В поле r пердпоследней структуры SValue цепочки vtop записывается r В поле t структуры CType записывается VT_INT Вызываются gaddrof(), vpushi(), gen_op('+'); В поле r структуры SValue находящейся в конце цепочки vtop устанавливается бит VT_LVAL Если два предидущих условия не сработали, происходит следующая обработка Вызывается load(), vdup() В поле r пердпоследней структуры SValue цепочки vtop записывается r В поле r последней структуры SValue цепочки vtop записывается значение поля r2 предпоследней структуры. Переменной rc2 присваивается RC_INT; Если переданное значение равно RC_IRET, переменной rc2 присваивается RC_LRET Значение r2 обновляется вызовом get_reg() Вызываются load() и vpop() В поле r последней структуры SValue цепочки vtop записывается значение r2 vtop->r2 = r2 Если поле r последней структуры SValue цепочки vtop содержит биты входящие в VT_LVAL и при этом проверка CType функцией is_float() возращает нулевой результат, происходит следующая обработка: Значение t обновляется значением поля t структуры CType. Это же значение записывается в t1 Если поле r последней структуры SValue цепочки vtop содержит биты входящие в VT_LVAL_BYTE, переменной t присваивается VT_BYTE Если поле r последней структуры SValue цепочки vtop содержит биты входящие в VT_LVAL_SHORT, переменной t присваивается VT_SHORT Если поле r последней структуры SValue цепочки vtop содержит биты входящие в VT_LVAL_UNSIGNED, в переменной t устанавливается бит VT_UNSIGNED Поле t структуры CType обновляется значением t Вызывется load() Поле t структуры CType обновляется значением t Если предыдущая проверка функцией is_float() и наличя VT_LVAL не сработала, вызывается load() Поле r последней структуры SValue цепочки vtop обновляется значением r
1   ...   20   21   22   23   24   25   26   27   ...   38


написать администратору сайта