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

компилятор ТСС. 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
страница6 из 38
1   2   3   4   5   6   7   8   9   ...   38
int tcc_add_include_path(TCCState *s1, const char *pathname) Функция выделят необходимый объем памяти для строки, содержащий путь в файловой иситеме и добавляет указатель в массис sysinclude_paths с помощью dynarray_add() void tcc_undefine_symbol(TCCState *s1, const char *sym) Функция создает символ с помощью tok_alloc(), получает на него сылку с помощью define_find() и вызывает define_undef() static inline Sym *define_find(int v) Проверяется выход за пределы массива table_ident[], и берется ячейка по переданному индексу, в структуре на которую указывает ячейка берется поле sym_define static void define_undef(Sym *s) Проверяется выход за пределы массива table_ident[], и сбрасывается ячейка по переданному индексу. int tcc_add_library_path(TCCState *s, const char *pathname) Функция выделят необходимый объем памяти для строки, содержащий путь в файловой иситеме и добавляет указатель в массив library_paths с помощью dynarray_add() static int expand_args(char ***pargv, const char *str) Функция разбивает строку на параметры. Пропускает пробелы и ждет окончания строки ('\0'). До его появления выделяется новая строка и добаляется в массив argv1. Для этого массива рекурсивно вызывается parse_args(), если передан хотябы один параметр. Тип output_type может быть TCC_OUTPUT_PREPROCESS, в этом случае, если указано имя outfile, вывод препроцессинга выводятся в него, если нет в стандартный вывод (консоль если не было перенапраления) Если output_type не равен TCC_OUTPUT_MEMORY, то результат должен быть выведен в файл. Если в массиве имен файлов, нулевой элемент равен строке «-», то переменной name присваивается строка "a", иначе с конца полного пути отсекатся имя файла (концовка строки после поледнего слеша) Полученное имя копируется в objfilename. Указателю ext присваивается начало позиции разширения файла с помощь tcc_fileextension(). Если разрешение не удалось найти ext будет содержать адрес непосредственно за именим файла. Если компялтор работает под windows, в память по адресу ext помещается ".dll" для типа TCC_OUTPUT_DLL или ".exe" для TCC_OUTPUT_EXE. Если тип итогового файла - TCC_OUTPUT_OBJ, не указан флаг объединения нескольких объектный файлов и на предыдущих шагах не удалось определить разрешение, то в конец имени дописывается ".o" Во крайнем случае, в качестве имени файла будет использоваться класическое "a.out" Если включена отладка (флаг do_bench), в start_time записывается результат вызова getclock_us(). Для Windows это сведется к _ftime() int tcc_set_output_type(TCCState *s, int output_type) Поле output_type состояния компилятора обновляется переданным значением. Подкаталог «include» каталога tcc_lib_path добавлестя в массив sysinclude_paths с помощью tcc_add_sysinclude_path(). Она в свою очередь использует dynarray_add() Тоже самое проиходит с подкаталогом «include/winapi» если компилятор собран под Windows. Оба этих подкаталогоа добавляются если не выставлен флаг nostdinc Если включен контроль выхода за границы выделенной памяти (флаг do_bounds_check): Макрос "__BOUNDS_CHECKING_ON" делается определенным с помощью tcc_define_symbol() Создаются секции ".bounds" и ".lbounds" с помощью new_section(). Указатели на них записываются в bounds_section и lbounds_section. Если выставлен флаг char_is_unsigned, то макрос "__CHAR_UNSIGNED__" делается определенным с помощью tcc_define_symbol() Если включена отладка (флаг do_debug): С помощью new_section(), создается секция ".stab". Поле sh_entsize в описании этой структуры будет равно размеру структуры Stab_Sym. Адрес структуры записывается в stab_section. С помощью new_section(), создается секция ".stabstr". дрес структуры записывается в stabstr_section В эту секцию записывается пустая строка с помощю put_elf_str() В поле link секции stab_section записывется адрес stabstr_section Вызывается put_stabs() для пустой строки. Для Windows Путь tcc_lib_path добавляется в строку "%s/lib" с помощью snprintf() и полученая строка передается в tcc_add_library_path()
1   2   3   4   5   6   7   8   9   ...   38


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