GCC - The Complete Reference (537669), страница 76
Текст из файла (страница 76)
Повторяет укаэанное объявление узла. Выдает на стандартный выход сообщение об ошибке использования неполного типа. Выдает сообщение об ошибке процесса синтаксического разделения (рагэе еггог глеззаде). Выводит обьявление узла дерева в указанный файл. Выводит информацию о типе узла в указанный файл. Выводит информацию идентификатора узла дерева в указанный файл. Включает или отключает отладку синтаксического разделения. ава Язык реепппрпппее перепеаа я зык регистрового лерелвса (Кеа)згег ТгапаГег1апацаае, КТ3 ) — ключевой злемент процесса компиляции. Назначение верхнего уровня компилятора заключается в генерации кода на языке КТ1., а нижнего уровня — в трансляции КТБ-кода на язык ассемблера. Большая часть оптимизации программы выполняется именно в то время, когда она находится в формате КТ1..
Настоящая глава посвящена описанию языка КТБ. Инструкции языка В'П. Одиночный оператор языка КТБ называется инструкцией ()лзп). Инструкции в программе объединены в двухсвязный список. Некоторые из них являются действительными инструкциями, в то время как другие содержат такие данные, как, например, таблицы ветвлений, используемые операторами ветвления.
Кроме того, существуют инструкции, представляющие собой объявления и играющие роль меток для операторов ветвления. Каждой инструкции соответствует ее уникальный идентификатор (1В), с помощью которого одна инструкция может ссылаться на любую другую. Шесть базовых кодов выражений Существует много типов инструкций. Калдая инструкция имеет определенный код выражения, указывающий на ее тип. Код языка КТ1., представляющий логическую последовательность выполнения программы, состоит всего из шести базовых типов, каждый из которых может содержать ссылки на другие типы. Например, код выражения хпвп служит указателем выполняемого оператора и в качестве операндов содержит другие инструкции.
Так следующая инструкция считывает значение переменной ча1 и записывает его в регистр. Ддя выполнения такой операции язык КТБ содержит кол выражения 1пвп и инструкцию с колом вве, которая, в свою очередь, Глава 20. Язык регистрового переноса 3 4 3 (впвп 12 10 14 (п11) (еес (тедк81 61] (гвее/Ег81 (вувкьо1 хеег81(еиа1")) [О а+О 84 А32))) -1 (п11) (п11)) Код выражения зпвп — это один из шести базовых типов кодов.
Любая програмиз в КТЬ-коде состоит из комбинации кодов выражений, приведенных в таблице 20.1, Таблица 20.1. Шесть базовых типов кодов выражений 4)тд выраввввв Опвевнвв Зтот код выражения используется для инструкций, которые не выполняют перехода и не вызывают функций. Инструкции такого типа загружают данные в регистры, выполняют арифметические операции, сравнивают значения и т.д 1явя Применяется для инструкций, которые будут (или могут) выполнять переход, т.е.
инструкция, как правило, содержит одну или несколько инструкций 1вье1 кее. Кроме того, данный код выражения используется для возврата из текущей выполняемой функции. Для простых условных и безусловных переходов указывается ссылка на аоае 1аЬе1 — метку для перехода. Для более сложных переходов при определении возможных меток перехода иногда приходится просмотреть все содержащиеся инструкции.
)ьяр 1ьвь Используется для инструкций, которые будут (или могут) вызывать функции. Такие инструкции должны обрабатываться отдельно, поскольку они могут непредсказуемым образом изменять содержимое регистров и ячеек памяти. Инструкции данного типа, как правило, содержат инструкции с1овьех и жехч которые указывают, содержимое каких регистров и ячеек памяти изменяется. Таким образом, в инструкции типа са11 впво будет содержаться либо инструкция жехч указывающая на блок памяти, через который передаются параметры, либо инструкции а1аььек и цве, указывающие рабочие региатры и регистры с аргументами функции.
са11 1ова Применяется для обозначения метки, которая может использоваться в качестве цели перехода. Инструкции даннога типа содержат инструкцию сазе 1аье1 потвьек, указывающую уникальный идентификатор. Идентификатор метки уникален для всего компилируемого блока, а не только текущей функции Инструкция ааее 1аве1, как правилО, используется в качестве ссылки в инструкции 1вве1 кет. Во время и после оптимизации ведется счетчик количества использования каждой метки в качестве цели перехода. созе 1еЬе1 Любая метка аоее 1вье1 мажет принадлежать к одному из следующих четырех видав; налива — единственный вид меток, которые не могут быть альтернативной точкой входа в функцию; втътта ввтат — метка точки входа в функцию, видимая только внутри блока компиляции; оьаав ь витях — является меткой точки входа в функцию и видима (с помощью компоновщика) во всех блоках компиляции; ваза автау — метка точки входа в функцию, может быть переопределена другим символом с таким же именем.
Зтот код выражения помещается внутри последовательности инструкций для указания места, которое не может быть достигнуто в процессе выполнения программы. Инструкция Ьвкк1ек вставляется после безусловного перехода и вызовов невоэвращающих функций. Ьькк1ех использует инструкцию с кодами тед и гаева Инструкция с кодом гяещ включает инструкцию вув)ьо1 теб. 344 часть ш.
Внутренняя структура и окружение )Гвд выранввнв Опнввввв Этот код выражения, который используется для указания определенной отладочной и декларативной информации. Любая инструкция типа паке содержит номер и поле строки буквенных символов (свагас1ег з1ппд). Номер, как правило, представляет собой номер строки исходного файла, указанного в строке символов. Инструкция пасе управляет данными о номерах строк, используемыми при отладке. Если число не является номером строки, то зта инструкция является указателем одного из следующих типов: нотк хнвн ркьвткр — указывает положение инструкции, которая была удалена; ноты хивы ркьктвр ьаввь — заменяет удаленную инструкцию созе хпьех, которая была удалена вследствие того, что не использовалась в качестве цели для перехода; нота хивы вьоск ввс — отмечает начало блока уровня кода; нота хван вьоск внр — отмечает конец блока уровня кода; ноты хван ва выехав вво — отмечает начало блока уровня кода, используемого для обработки исключений; ноте хнвн нн аксхон ннр — отмечает конец уровня, используемого для обработки исключений; нота хван ьоот вко — отмечает начало цикла иьше или еагю нотк хивы ьоов кнр — отмечает конец цикпаньххп или сок; нотк хивы ьоов сант — отмечает в цикле место, на которое будет переходить оператор аапксппе; нотк хнвн ьоот утот — отмечает в цикле место начала проверки выхода из цикла; ноты хивы трнстхон выр — отмечает место вблизи конца функции перед меткой, на которую переходит оператор кеспкп; катк хивы вытзыт — отмечает код, непосредственна следующий за вызовом функции типа весзврг).
пасе Типы и содержимое инструкций Таблица 20.2. Базовые типы данных инструкций языка йуг. т т))ун О Выполняемое выражение. Выражение языка Вть обозначается ВТХ. Целочисленный тип данных, соответствующий типу данных 1пс языка С. Выражение Целое число Целочисленный тип данных, определяемый переменной ноет нхрв хнт, которая, как правило, в качестве данного типа данных устанавливает 64-битное значение. Целое число расширенной точности Последовательность символов, заканчивающаяся нулем, как и в языке С.
Строки в большинстве случаев используются а качестве символьных ссылок, но иногда могут применяться и для представления описательных данных о машине, как будет указано в главе 21. Во внутреннем представлении строка нулевой длины соответствует нулевому указателю. Строка Каждый тип инструкций уникален и служит определенной цели. Поэтому каждый тип содержит набор данных, соответствующий его назначению. Очень часто данные типа могут быть представлены в виде другой инструкции. Тем не менее, такую цепочку связанных гсТ) -инструкций можно всегда проследить до базовых типов данных. Данные, содержащиеся в операторах языка КТт., могут принадлежать к одному из пяти типов инструкций, описанных в таблице 20.2.
Глава 10. язык регистрового переноса 345 Т»с»»ст)гуся»» Ов»св»»е Произвольное количество указатвлей на выражения. Количество элементов вектора явным образом указывается в инструкции. Во внутреннем представлении векторы нулевой длины соответствует нулевым указателям. Вектор Формат и содержимое выражений языка КТ) может изменяться в широких пределах, но всегда существуют три поля: идентификатор, адрес предыдущей инструкции и адрес следующей инструкции.
Эти три значения могут быть определены для любой инструкции с помощью следующих трех макросов: 1МЯМ Птр(1пвп) ВЕЕУ ГМВМ(хпвп) МЕХт 1МЯМ(хпвп) вцт соре(хвх,сот)е)г гпе соде = вет сове(хех)г Макрос ))ее ете ехвн используется для определения всех выражений языка КТ(., содержащихся в файле хе1. бей, Этот макрос, как показано в следующем прииере, требует указания четырех аргументов: РЕЕ Еть ЕХВЕ(СОМЕ ЕХЕС, "сопб ехес", "ее", 'х') Первый передаваемый макросу аргумент представляет собой имя выражения языка КТ), представленное буквами верхнего регистра. Он используется в исходном коде нэ языке С в качестве параметра типа еппзв как уникальный идентификатор выражения.
Второй аргумент — имя выражения языка КТ), состоящее из букв нижнего регистра в формате АЯС!). Это имя выводится в диагностических сообщениях. Третий аргумент содержит список типов данных операндов, причем каждому типу соответствует один буквенный знак. Описание типов приведено в таблице 20.3. Четвертый аргумент — состоящий из одного буквенного символа указатель класса выражения КТ) . Перечень классов приведен в таблице 20.4. Первую инструкцию можно извлечь с помощью функции дев 1пвпв (), а последнюю — с помощью функции дес 1авс 1пвп().
Большая часть кода коютиляп)ра ОСС, работающего с инструкциями, написана лля выполнения операций с выражениями. Выражение языка КТ(. обозначается КТХ. Такие инструкции-выражения представляют собой операторы, содержащие выполнимый код программы. Внутри кода компилятора они сортируются в структуру, доступ к которой осуществляется с помощью указателя с именем указателя типа тех. Каждое выражение имеет свой код выраэксения (ехргезз(оп соде) (или КТХ-код), указывающий тип выражения. Коды выражений перечислены в файле хе1.бей в виде набора имен констант типа перечислений, Коды выражений не зависят от платформы машины, т.е. язык КТВ является машинно-независимым. КТХ-код можно установить в структуре хвх, а затем считать его с помощью следующих двух макросов, определенных в файле ХЕ1. Ь: 346 Часть (((.
йнутренняя структура и окружение Таблица 20.3. Коды, используемые для указания типов операндов выражений языка )(Т(. явд влврвняа Опнвввнв Тип не указан. Попытка обработки этого типа сгенерирует предупреждение. Неиспользуемое поле. Указатель на заголовок битовой карты (Ь)(гоар). Определение базового блока инструкций (с одним входом и одним выходом). Указатель на выражение языка ВТ( . Указатель на массив выражений языка ПТ( . Целое число. Целое число, указывающее следующее: 1 — инструкция удалена; 2 — начало блока; 3 — конец блока; 4 — начало цикла; 5 — конец цикла; 6 — продолжение цикла; 7 — инструкция в начале цикла; 8 — условие завершения цикла; 9 — конец функции; 1Π— конец пролога функции; 1! — начало эпилога функции; 12 — удаленная метка; 13 — начало функции (точка входа); 14 — начало области обработки исключений; 15 — конец области обработки исключений; 13 — повторяющийся номер строки; 17 — базовый блок; 13 — ожидаемое значение, 19 — прогноз.