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

компилятор ТСС. 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
страница35 из 38
1   ...   30   31   32   33   34   35   36   37   38
). Перед этим если sbt равна VT_PTR, полю t структуры CType связанной с последней SValue присваивается VT_INT и выдаеся предупреждение Если предидущая проверка dbt не проходит, проверяется кодирует ли она VT_INT. Если при этом sbt равна VT_LLONG, вызываются lexpand() и vpop() Если sbt равна dbt или флаг nocode_wanted установлен, проверяется кодирует ли dbt тип VT_PTR и содержит ли при этом поле r последней SValue биты входящие в VT_LVAL. Если проверка проходит, в этом поле сбрасываются биты входящие в VT_LVAL_TYPE и устанавливаются биты побитового И VT_LVAL_TYPE и результата lvalue_type() Ссылка на CType последней SValue обновляется адресом переданного CType void force_charshort_cast(int t) В переданном тип оставляются только биты кодирующие простые типы. Если полученное значение равно VT_BYTE, переменной bits присваивается 8, иначе 16 Если переданный тип содержит бит VT_UNSIGNED, вызывается vpushi() и gen_op(), иначе происходит следующая обработка Переменная bits обновляется разностью 32 и самой bits; Вызываются vpushi() и gen_op() В поле t структуры CType последней SValue сбрасывается бит VT_UNSIGNED Вызываются vpushi() и gen_op() void gen_cvt_itof1(int t) В поле t структуры CType последней SValue оставляются только биты и кодирующие простые типы и бит VT_UNSIGNED. Если полученное значение равно побитовому ИЛИ VT_LLONG и VT_UNSIGNED, происходит следующая обработка: Если передан VT_FLOAT, вызывается vpush_global_sym() Если передан VT_DOUBLE вызывается vpush_global_sym() Вызываются vrott(), gfunc_call(), vpushi(); Поле r последней SValue обновляется значением REG_FRET Если проверка на VT_LLONG и VT_UNSIGNED не проходит, вызывается gen_cvt_itof(t); void gen_cvt_itof(int t) Вызываются save_reg() и gv() Если CType связанный с последней SValue кодирует VT_LLONG, чтырежды вызывается o() Если кодируется побитовое ИЛИ VT_INT и VT_UNSIGNED, вызываются o(), g(), трижды o() Если кодируется другой тип, трижды вызываются o() Поле r последней SValue обновляется значение TREG_ST0 void gen_cvt_ftof(int t) Вызывается gv(); static Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size) Увеличиватся указатель anon_sym Полученное значение помещается в переменную v Получаем символ с помощью global_identifier_push() Поле ref структуры CType связанной с полученным символом обновляется значением поля ref переданного CType Поле r полученного символа обновляется побитовым ИЛИ VT_CONST и VT_SYM Вызывается put_extern_sym() Вызыввращается адрес полученного символа int gjmp(
1   ...   30   31   32   33   34   35   36   37   38


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