GCC - The Complete Reference (537669), страница 71
Текст из файла (страница 71)
Это дерево, представляющее струк- Глава та. Выход компилятора 3 1 7 туру входного исходного кода, можно записать в файл с расширением . Си с помо- шью опции -Ыпвр-сгапв1асйоп-ппдс. Для этого подается примерно такая команда: 3 дсс -ссЪлар-сгапв1ас1оп-ип1С вЬсмйшар.с -о еЬоийшер Файл, созданный с помощью этой команды, вЬомйшвр. с.
Сп, содержит текстовое представление дерева синтаксического разбора. Каждый узел имеет свой номер (91, 92 и тд.), и структура программы представлена ссылками каждого узла на номера других узлов, Можно в некоторых пределах управлять объемом данных, выводимых для каждого узла. Так, следующая команда формирует дерево синтаксического разбора, содержащее информацию о внутренней адресации компилятора. Эту информацию иожно использовать для определения перекрестных ссылок в дереве синтаксического разбора и нахождения внутренних адресов, получаемых с помощью опции -й (списанной ниже в этой главе): 5 дсс -гйимр-Сгапа1аС1оп-ип1С-аййгеев вЬомсЪпар.с -о еЬоийшар Приведенные ниже дае команды выведуг листинги с большим и с меньшим объемом информации соответственно: 3 дсс -сйпмр-сгапе1ас1оп-ип1с-а11 еъоийпмр.с -о еьомсъиар 5 дсс -сйппр-сгапе1ас1оп-пп1С-в11а аъоийпмр.с -о аьоийппр Дерево, полученное любой из приведенных выше команд, читается очень легко.
Следующий фрагмент дерева синтаксического разбора показывает, что каждый его узел описывается уникальным идентификатором и несколько более описательным именем. Кроме того, дерево содержит список атрибутов: егсрс вЬоийшар.сс5 ехсегп 91 бппсезоп йес1 сурес 93 агдас 95 1пдсс 4 аздпс 64 92 1йепе151ег лойе 93 бипсевоп Суре геспс 97 агсрс вЬомйшар.ссэ в1гес 912 94 чаг йес1 варе: 91 снапс 914 аздпс З2 95 рагаС йес1 На этом уровне синтаксического дерева большинство атрибутов определены по атношению к другим узлам дерева.
Например, атрибут павсе представляет собой номер узла, содержащего атрибуты всгд (строка) и 1пдсь (длина). некоторые узлы, например, 5ппсс1оп суре, содержат атрибут а1дп (выравнивание). Переменные, в частности аргументы и объявления, содержат атрибуты суре и пагае и, кроме того, атрибут овей, представляющий собой количество использований переменной в программе. Многие узлы имеют атрибут вгср (положение источника), который указымст имя и номер строки файла исходного кода, откуда был получен данный узел. папе сЬап есгд азае ров папе сЬап а1дп папе егер агдс пвей 92 94 паза еб еа 95 СУРе: 97 Е1О 1пгес 911 Зз пеейс 1 Е1З Сурвс Ет аЬомйипр.
с с 4 97 езаес 912 о 3 18 Часть!П. Внутренняя структура и окружение Заголовочные файлы Опция -н, которую также можно записать в форме --егасе-1пс1ибев, генерирует многоуровневый список всех включаемых файлов. Следуюший пример представляет собой выходной код, сгенерированный на системе Ыпцх для программы, написанной на языке С, включавшей только один заголовочный файл вебдо.
Ь: /ивг/11Ыдсс-11Ь/1586-рс-11пих-дпи/3.2/1пс1ийе/вгк31о.Ь /ивг/1пс1ийе/Ееасигев.Ь /ивг/1пс1ийе/вув/сйегв. Ь /ивг/1пс1иете/дпи/ всиЬв . Ь /ивг/11Ыдо с-11Ы15 8 6-рс-11пих-дпи/3. 2/1пс1исте/всссе г . Ь /ивг/1пс1исе/Ь1св/курев.Ь /ивг/11Ыдсс-11Ь/1586-рс-11пих-дпи/3.2/1пс1ийе/всктктег.Ь /ивг/1пс1икте/Ььсв/ргвгеактгурев.Ь /ивг/1пс1исе/Ьгсв/всвект.Ь /ивг/1пс1исе/11Ь1о.Ь /ивг/ъпс1иое/ О сопг19.Ь /ивг/11Ъ/дсс-11Ы1586-рс-11пих-дпи/3.2/1пс1исе/векыег.ь /иег/1пс1иете/маваг.
Ь /ивг/11Ыдсс-11Ы1586-рс-11пих-дтш/3. 2/1пс1исе/всевзег.Ь /ивг/1пс1икте/Ььсв/маваг.Ь /ивг/1пс1икте/дсопт.Ь /ивг/1псзикте/маваг.Ь /ивг/11Ыдсс-11Ъ|1586-рс-11пих-дпи/3. 2/1псзикте/вссъзеЕ.Ь /ивг/11Ыдсс — 11Ы1586-рс-11пих-дпи/3. 2/1пс1исе/вессек. Ь /ивг/11Ыдсс-11Ы158 6-рс-11пих-дпи/3. 2/1пс1исе/ведаге. Ь /ивг/1пс1ибе/Ьггв/втз31о 11т.Ь Ми1Е1р1е 1пс1иете диагсв шау Ье ивеги1 Еог1 /ивг/1пс1иое/Ъ1св/рЕЬгеаасурев.Ь /ивг/1пс1исе/Ьгсв/всвеет.Ь /ивг/1пс1икте/Ьгсв/вс81о 11а.Ь /ивг/1пс1иде/дпи/всиЬв.Ь Каждый уровень включения указывается количеством точек перед именем файла. Кроме того, в нижней части листинга приводятся имена заголовочных файлов, которые, возможно, необходимо исправить, поскольку включение любого из них более одного раза может привести к возникновению проблем, связанных с многократными объявлениями.
Необходимый программе объем памяти Ъ Тога1 0.664 12.239 3.985 1.803 мипвег 7 129 21 19 Вуеев 56 доза 336 152 КТХ аоогевв сапвс ъпе сопят соивзе сапвс тессог У компилятора можно запросить отчет об объеме памяти, требуемой для откомпилированнойой программы, а также подробные данные о том, каким образом эта память была выделена. Следуюший листинг содержит пример отчета о требуемом объеме памяти: Глава 18.
Выход компилятора 3 19 рс гед шеш вутвЬо1 гег ссо р1пв ед тога1 Д11ос ас е(( 8192 12 К 8192 З2К 28К 4096 52 К 8192 152 К Всг1пд роо1 епсг1ев 1аепс161егв 41осв Ьус ее ЕаЬ1е в1ве со11/веагсЬ 1пв/веагсЬ а тд. епегу 1опдевг епсгу 452 452 (100.00%) 16384 4805 (3339 очегпеас) 64К 0.0168 0.7609 10.63 Ьуеев (+/- 5.78) Зб Из приведенною листинга можно определить объемы памяти, выделенной для различных частей программы, и количество использований каждой из выделенных областей.
Такие данные могут оказаться особенно полезными лля анализа больших программ и объектных модулей, предназначенных для встраиваемых систем. Время компиляции программы Опция -01ше может использоваться при компиляции и компоновки для вывода компилятором дсс времени, затраченного на выполнение каждого отдельного процесса. Например, следующая команда компилирует три программы на языке С на ассемблерный язык, вызывает ассемблер для формирования отдельного объектного файла для каждой программы и использует со11есс2 для их компоновки: дсс -е1ше деевьои.с вегшакег.с вьоивег1пд.с -о деевьои $ сс1 0.15 0.02 4 ав 0.01 0.00 8 сс1 0.08 0.03 4 ав 0.01 0.01 4 сс1 0.13 0.03 4 ав 0.01 0.00 $ со11есс2 0.13 0.05 81ве 8 16 32 64 512 1О24 112 20 ток а1 1 14 216 391 1 1 1 801 овес 6216 4192 ЗЗ92 28 К 24 К 1О24 42 К 2580 112 К 8 224 3456 З128 8 16 16 ваза ОчегЬеад 184 180 88 288 196 28 416 104 1484 0.095 2.657 40.987 37.097 0.095 0.190 0.190 320 Часть!В.
Внутренняя структура и окружение Первое из двух приведенных для каждого процесса значений представляет собой пользовательское время (время, затраченное на выполнение кода подпроцессов)„а второе значение — системное время (время, затраченное процессом на выполнение системных вызовов). Действительные показания отсчетов времени в листинге не приводятся. Общее время, затраченное на выполнение всего процесса дсс, включая отсчеты времени, может быть получено при запуске дсс с помощью стандартной утилиты с1ше, как показано в следующем примере: 3 С1ше дос -Сгве деееЬов.с еегвахег.с вцовесг1пд.с -о деееЬон Промежуточное дерево компиляции С++ Компилятору д++ можно указать, что он должен выводить код промежуточного языка, который генерируется на верхнем уровне при предварительной трансляции.
Вывод может выполняться в различных точках процесса компиляции. Следуюшая команда выведет промежуточный код после его генерации до внесения каких-либо изменений или оптимизации: ь д++ -гктпвр-Егее-ог1дгпа1 взпшах.срр -о шзпшех Код промежуточного языка можно вывести также и после выполнения оптимизации: ь д++ -асцпар-Сгее-орСТв1хект шзпшах.срр -о ш1пшах Процесс подстановки кода айве-функций выполняется в коде промежуточного языка, а его результаты можно вывести с помощью следующей команды: Ь.
д++ -гттшар-Егее-1п11пео шзпшах.срр -о взпшах Формат выходных данных может задаваться указанием модификатора в конце имени каждой опции вывода кода. Добавление модификатора -аббгевв к концу опции приведет к включению адресной информации, соответствующей адресной информации, выводимой с помощью опции -б (описанной ниже в этой главе). Для уменьшения объема информации, включаемой в листинги, укажите модификатор -в11ш, а для его увеличения — модификатор -а11.
Например, следуюшая команда выведет код промежуточного языка после оптимизации в описательной форме: ь д++ -гопвр-Сгее-орезвзаео-а11 в1пшах.срр -о в1пвах Иерархия классов в программах на языке С++ Компилятору д++ можно указать, чтобы он выводил полную иерархию классов и таблицы виртуальных функций вашей программы. В выходные данные включается полная иерархия используемых программой системных классов, поэтому размер выходных данных может быть довольно большим. Следуюшая команда приведет к компиляции и выводу полной иерархии классов программы шйпшах. срр: ь д++ -гктшар-с1аее-ьзегагсцу ш1пвех.срр -о в1пшах В результате выполнения этой команды будет создан исполняемый файл шхпаах и текстовый файл ш1пшах.
срр. с1ава, содержащий иерархию классов. Следующая Глава 18. Выход компилятора 32 1 команда дает тот же результат, но в иерархию классов также будет включена адресная информация, которая может пересекаться с информацией, выводимой по опции -6: 3 д++ -гсошр-с1авв-Ьтегагсну-аИгевв -са ш1пшах.срр -о шьшпах Опция -(т выводит некоторую внутреннюю информацию компилятора, это описано далее в этой главе.
Объем выводимой информации можно уменьшить, используя следующую опцию: Ь д++ -гсошр-с1авв-Ьтегагсну-в11ш ш1пшах.срр -о ш1пшах Файл большего размера можно получить с помощью следующей опции: й д++ -Ек)пшр-с1авв-Ь1егагсну-а11 шхпшах.срр -о шхпшах Информация для включения в сценарий Макей!е Имеется набор опций, которые можно использовать лля указания компилятору сканировать файлы исходного кода и генерировать зависимости для вставки в тайефайл. Например, следующая программа включает два заголовочных файла: /* депвнои.с */ атпс1пк)е "впгшахег.Ь" аьпс1и((е "вноивпг1пд.Ь" ьпе ша1п(1пс агдс,сЬаг *агдг()) ( сЬаг *впг1пд' вегьпд веглахег()) вьоивегхпд(вегьпд)) Следующая команда компилятора считывает файл исходного кода и формируег строку зависимостей для та)(е-файла. В этом примере заголовочный файл всгша)пег. Ь включает файл шоЕЬас)с.
Ь: й дсс -М деевЬои.с деевьои.о: деевьои.с вегшакег.ь шоеьасх.ь вьоивегьпд.ь Опция -и устанавливает опцию -и, которая подавляет весь вывод, кроме строки зависимостей. Если вы желаете продолжить компиляцию после формирования строки зависимостей, то выполните следующую команду: 3 дсс -мр деевьои.с -о деевьои Эта команда сгенерирует выполнимый файл деевЬои и запишет строку зависимостей в файл десвЬои. (т. Для указания имени файла может использоваться опция -му. Это показано в следующем примере, где строка зависимостей записывается в файл берепбв. Еехс: 3 дсс -МР -МР еерепк)в.пехп деканом.с -о депвнои 11 А Гриффитп 322 часть )и.