66fca92a67dccee4ae53436ab7c99844.ppt
- Количество слайдов: 12
Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ) Разработка средства анализа трассы исполнения двоично-транслированной программы в терминах промежуточного представления компиляции. Квалификационная бакалаврская работа студента 112 группы Факультета Радиотехники и Кибернетики Загребина Андрея Александровича Научный руководитель: Старший научный сотрудник Масленников Дмитрий Михайлович Москва, 2005
Описание проблемы отладки двоичного оптимизирующего компилятора: Intel x 86 код – код Эльбрус 2000 Процесс отладки: Intel x 86 код Двоичный оптимизирующий компилятор Интерпретатор Архитектуры Эльбрус 2000 Исполняемый код Эльбрус 2000 Исполнение Сильное различие ! Dump-файл Информация о компиляции Промежуточное представление Trace-файл Трасса исполнения Информация о выполненных командах Нехватка информации о компиляции Необходимость сопоставления информации вручную ! Исправление ошибок Ошибки исполнения Ошибки восстановления x 86 контекста Выявление Причин Ошибок В связи с возникшей задачей было поставлено следующее техническое задание.
Техническое задание. 1. Выявить основные различия между представлением семантики в трассе результирующего исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 и промежуточным представлением двоичного оптимизирующего компилятора: Intel x 86 код – код Эльбрус 2000, а также важную с точки зрения анализа разработчиком при отладке результирующего кода информацию из промежуточного представления компилятора, которая отсутствует в трассе исполнения. 2. По результатам анализа из предыдущего пункта разработать средство отладки двоичного компилятора Intel x 86 -> Эльбрус 2000, позволяющего представить результат исполнения откомпилированной программы (трассу) в терминах промежуточного представления компилятора. 3. Разрабатываемое средство должно представлять из себя программу, запускаемую из командной строки в операционной системе Linux. 4. Программа должна обрабатывать трассу исполнения кода, полученного после компиляции любого кода платформы Intel x 86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x 86 контекста.
Intel x 86 код, информация о регионах, профильная информация Оптимизирующий двоичный компилятор. начальная (front end) Синтаксический Семантический разбор первичная генерация и частичная оптимизация Фазы анализа промежуточного … представления Фаза анализа управления … Фазы … оптимизаций … Аналитические Структуры данных … Абстрактные ОПЕРАЦИИ компилятора Номер операции … Имя операции Аргументы операции опт. Код E 2 K Граф потока управления Control Flow Graph (CFG) Промежуточное Представление (IR) Операционная семантика Генер. кода Enter Op 1, Op 2 … переход … Enter Op 1 Op 2 … переход x 86 адрес соответствующей x 86 операции Обратная дуга Цикл Узлы CFG (Линейные участки кода) Enter Op 1, Op 2 … переход …
Понятия контрольной точки и контекста. • Обработка любого возникшего прерывания без его потери!!! • Последующее восстановление x 86 контекста!!! Восстанавливаемый Невосстанавливаемый В компиляторе: (интеловская память) ……………… T=7 <0002 f 8> 5 1258. STDSB <921> … [P 1] (X 86 Addr: 0 x 80481 f 1) ……………… T=7 <0002 f 8> 0 921. SRP <1258>. . . [P 1] (X 86 Addr: 0 x 80481 f 4) cc_addr=<0 x 96 a 8> поставить контрольную точку ……………… Прерывание обработка Компенсирующий код (восстанавливает x 86 контекст) В трассе (для архитектуры Эльбрус 2000): SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … В регистре RPR хранится адрес компенсирующего кода Для проверки механизма восстановления x 86 контекста создан специальный вид интерпретатора lsim_trap, который сам генерирует псевдо - прерывания.
Dump-файл Дизассемблер Эльбрус 2000 Содержит список операций промежуточного представления информацию компиляции о них и их планирование по тактам: Scheduled IRE 2 K of … T=0 <000000> 0 1. ENTER (X 86 Addr: 0 x 804834 d) T=0 <000000> 1 605. SETWD 0 x 6000000 (X 86 Addr: 0 x 0000000) T=0 <000000> 1 606. SETBN 0 x 1778 fe 0 (X 86 Addr: 0 x 0000000) T=0 <000000> 0 943. CTPD <two> 6. -> C 0 (X 86 Addr: 0 x 0000000) T=0 <000000> 1 607. SETBP 0 x 1778 fe 0 (X 86 Addr: 0 x 0000000) ……………… // ТЕЛО T=7 <0001 e 8> 0 627. MOVs Gs 0 -> Rs 26 (X 86 Addr: 0 x 8048153) T=7 <0002 f 8> 5 1258. STDSB <921> … (X 86 Addr: 0 x 80481 f 1) T=7 <0002 f 8> 0 921. SRP <1258>. . . (X 86 Addr: 0 x 80481 f 4) T=7 <0002 f 8> 2 1175. STDSW <1177> … (X 86 Addr: 0 x 80481 e 7) T=7 <0002 f 8> 0 1177. SRP <1175>. . . (X 86 Addr: 0 x 80481 ea) T=7 <000200> 1 690. ANDs Bs 3 0 xff -> Bs 2 (X 86 Addr: 0 x 8048161) T=7 <000260> 0 681. CLPAND BP 1[F] BP 2[F]>BP 0[T](X 86. . : 0 x 0. ) T=7 <000038> 0 614. BRANCH. c C 0 BP 3[T](X 86 Addr: 0 x 0000000) T=7 <000038> 0 590. END (X 86 Addr: 0 x 0000000) Oper 2 Code. Info … T=0 U=0 1. ENTER addr=<0 xa 880> 0) T=0 U=1 605. SETWD T=0 U=1 606. SETBN - Node 1 (loop s s 0000<0 xa 880> HS 0000 c 012 804834 d_1_region: CS 0 4000000 c disp %ctpr 1, M_a 8 e 0 CS 1 0 c 5 fcfe 0 setwd wsz = 0 x 60, nfx = 0 x 0 setbn rsz = 0 x 3 f, rbs = 0 x 20, rcur = 0 x 3 c setbp psz = 0 x 17 LTS 0 00000 c 00 ……………… // ТЕЛО 0007<0 xa 8 b 8> HS 9 c 041023 : SS 80000440 ct %ctpr 1 ? %pred 3 ipd 2 ALS 0 10 c 0 e 09 a adds, 3 0, %g 0, %r 26 ALS 1 0016 d 014 ands, 2 %b[22], _f 16, _lts 0 lo 0 xff, %b[20] ALS 2 2 ec 0 d 8 af stdsw, 2 %r 47, [ _f 32, _lts 0 0 x 804 a 074 ] ALS 5 2 cc 0 d 808 stdsb, 2 %b[8], [ _f 32, _lts 0 0 x 804 a 016 ] PLS 0 61622260 pass %pred 1, @p 0 pass %pred 2, @p 1 andp ~@p 0, ~@p 1, @p 4 pass @p 4, %pred 0 Trace-файл ***** 0 xa 8 b 8. 8353 ***** HS 0 9 c 041023 : CT %ctpr 1(0 xa 880)t. p. %bp 3<%P 3>(1) SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … ALS 0 0 10 c 0 e 09 a ADDs(0), %g 0<. . > (0 x. . )->%r 26<. . >. . ALS 1 0 0016 d 014 ANDs%br 22<. . >(0 x. . ), (0 x. . )->%br 20… ALS 2 0 2 ec 0 d 8 af STDSW %r 47<%R 57> (0 x 23 f) ->. . ALS 5 0 2 c 0 d 808 STDSB %br 8<%R 74> (0 x 57) ->. . PLS 0 0 61622260 PASS %bp 1<%P 1> (0) -> @p 0 (0) PASS %bp 2<%P 2> (1) -> @p 1 (1) CLPAND ~@p 0, ~@p 1 -> @p 4 %bp 0<%P 0> (0) ***** 0 xa 880. 8354 ***** HS 0 0000 c 012 : CS 0 0 4000000 c BRANCH %ctpr 1 (0 xa 8 e 0) CS 1 0 0 c 5 fcfe 0 SETR 0 setbp(1) setbn(1) settr(0). . LTS 0 0 00000 c 00 type(0) rpsz(0) wsz(0 x 60) nfx(0) ……………… // ТЕЛО
Анализ различий промежуточного представления компиляции и трассы исполнения (dump- и trace-файлов). В результате проведённого анализа были обнаружены следующие отличия. В трассе исполнения не хватает следующей информации о компиляции в терминах IR кода: • • • Номеров операций в широких командах. Номеров узлов, в которых находятся широкие команды, встречаемые в трассе. (его имеет смысл ставить у команды только, если предыдущая команда находится в другом узле) У операций ненулевого x 86 адреса (т. е. если операция не добавлена искусственно компилятором) соответствующих им операций Intel x 86 архитектуры. Номера одной или двух операций SRP в широкой команде Номера операции, с которой связанна стоит данная SRP Адресов компенсирующих кодов, соответствующих исполнившимся операциям SRP А также информации, которую разработчику приходится находить вручную: • • Число итераций цикла Направление перехода в управляющем графе, т. е. номер узла, в который осуществляется переход Флага исполнения конкретной операции SRP (в трассе есть только флаг исполнения одной из операций SRP) Признака начала исполнения компенсирующего кода последней SRP
Реализация Средства dtlink. Двоичный оптимизирующий компилятор Исполняемый код Эльбрус 2000 Исполнение Сильное различие ! Dump-файл Информация о компиляции Промежуточное представление Trace-файл Трасса исполнения Информация о выполненных командах Новый Trace-файл Трасса исполнения Информация о выполненных командах в терминах компилятора и исполнения Выявление Причин Ошибок Разработанное Средство dtlink Программа написана на языке С и запускается с командной строки операционной системы Linux. Разработанное средство производит следующие действия: • Разбирает выдачу компилятора • Собирает информацию о компиляции • Разбирает трассу исполнения кода • Получает отсутствующую в трассе информацию об исполнении • Вставляет в новую трассу - старую трассу - всю собранную информацию • Выдаёт новую трассу
Результат работы средства dtlink. Модифицированный trace-файл. ***** 0 xa 8 b 8. 8353 ***** [ 1177. SRP <1175> (1) (x 86 addr: 0 x 80481 ea) (cc_addr: 0 x 8 cf 8 ) ] [ 921. SRP <1258> (1) (x 86 addr: 0 x 80481 f 4 ) (cc_addr: 0 x 96 a 8) ] HS 0 9 c 041023 614. : CT %ctpr 1(0 xa 880)tak. pred. %bp 3<%P 3>(1) Node 1 [0 x 0000000] SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) vfdi(0) … ALS 0 0 10 c 0 e 09 a 627. ADDs (0), %g 0<%G 0> (0 x. . ) -> %r 26<%R 36> (0 x. . ) [0 x 8048153] ALS 1 0 0016 d 014 690. ANDs %br 22<%R 88> (0 x. . ), (0 x. . ) -> %br 20<%R 86>(0 x. . )[0 x 8048161] ALS 2 0 2 ec 0 d 8 af 1175. STDSW %r 47<%R 57> (0 x 23 f) -> DS(. . ) [. . ] [0 x 80481 e 7] ALS 5 0 2 cc 0 d 808 1258. STDSB %br 8<%R 74> (0 x 57) -> DS(. . ) [. . ] [0 x 80481 f 1] PLS 0 0 61622260 681. PASS %bp 1<%P 1> (0) -> @p 0 (0) [0 x 0000000] PASS %bp 2<%P 2> (1) -> @p 1 (1) CLPAND ~@p 0, ~@p 1 -> @p 4 %bp 0<%P 0> (0) ***** 0 xa 880. 8354 ***** Node 1. 5 (1. Enter 0 x 804834 d) HS 0 0000 c 012 : CS 0 0 4000000 c 943. BRANCH %ctpr 1 (0 xa 8 e 0) [0 x 0000000] CS 1 0 0 c 5 fcfe 0 605. SETR 0 setbp(1) setbn(1) settr(0). . [0 x 0000000] LTS 0 0 00000 c 00 type(0) rpsz(0) wsz(0 x 60) nfx(0) ……………… // ТЕЛО //Прерывание !!! ………………//Вызов компенсирующего кода Enter in COMP CODE of [ 921. SRP <1258> (x 86 addr: 0 x 80481 f 4) (cc_addr: 0 x 96 a 8) ] ***** 0 x 96 a 8. 9541641 ***** ……………. . При сравнении трассы откомпилированного кода Ошибки связанные с циклами и трассы эталонного кода Сразу видно: - Отличие числа итераций неправильное получение неправильного - неправдоподобно большое построение условия выхода число итераций условия выхода в процессе итерации
Пример 1 на падение интерпретатора lsim из-за ошибки преобразования операций. Неправильная трасса кода полученного отлаживаемым компилятором ***** 0 xe 738. 21718 ***** Node 7. 0 27. !ANDs %br 3<%R 197>(0 x. . ), (0 x. . )->%br 5<%R 199>(0 x. . )[0 x 804852 a] ………………………………………… ***** 0 xe 748. 21719 ***** 31. !SUBs %br 5<%R 199>(0 x. . ), (0 x. . )->%br 3<%R 197>(0 x. . )[0 x 8048533] ………………………………………… ***** 0 xe 758. 21720 ***** 115. !CMPLEs %br 3<%R 197>(0 x. . ), (0 x. . . )->%bp 1<%P 1>(0)[0 x 0000000] ………………………………………… ***** 0 xe 758. 21720 ***** 11. : CT %ctpr 1 (0 xe 820) tak. pred. ~%bp 1<%P 1>(0) Node 3 [0 x 8048545] ………………………… ***** 0 xe 820. 21727 ***** Node 3. 0 переход ………………………………………… 264. UDIVX %dr 29<%R 39> (0 x. . ), (0 x. . ) -> %br 66<%R 132> [0 x 8048578] ………………………………………… exc_div: ( division by 0 or the quotient is too large ). Правильная трасса кода полученного эталонным компилятором Intel x 86 code: 804852 a: andw 8048533: subw 804853 c: cmpw 8048545: jle $0 xff 00, 0 x 804 a 05 a $0 x 3 a 00, 0 x 804 a 05 a 8048578 После c 2 do во фрагменте 804851 c: 25. LDDSH 0. . -> Vs 76 (X 86 Addr: 0 x 804852 a) 27. ANDs Vs 76. . -> Vs 78 (X 86 Addr: 0 x 804852 a) 31. SUBs Vs 78. . -> Vs 81 (X 86 Addr: 0 x 8048533) 115. CMPLEs Vs 81. . -> P 1 [T](X 86 Addr: 0 x 0000000). . 11. BRANCH. c C 0 BP 1[F] (X 86 Addr: 0 x 8048545). . 264. UDIVX Vs 141. . -> Vs 56> (X 86 Addr: 0 x 8048578). . Формат 32 бита ! До c 2 do во фрагменте 804851 c: ***** 0 xf 5 d 8. 25755 ***** 27. ANDs Vs 76. . -> Vs 78 (X 86 Addr: 0 x 804852 a) 27. ANDs %br 8<%R 74>(0 x. . ), (0 x. . )->%br 5<%R 1>(0 x. . ) [0 x 804852 a]. . . ………………………………………… 29. ANDs Vs 78. . -> Vs 79 (X 86 Addr: 0 x 8048533) ***** 0 xf 600. 25757 ***** 31. SUBs Vs 79. . -> Vs 81 (X 86 Addr: 0 x 8048533) 31. SUBs %br 7<%R 3> (0 x. . ), (0 x. . )->%br 10<%R 76>(0 x. . ) [0 x 8048533]. . . ………………………………………… 33. ANDs Vs 81. . -> Vs 82 (X 86 Addr: 0 x 804853 c) ***** 0 xf 628. 25759 ***** 34. SUBfh Vs 82. . -> Vs 83 (X 86 Addr: 0 x 804853 c) 34. SUBs FLH %br 6<%R 2>(0 x. . ), (0 x. . )->%br 6<%R 2>(0 x. . ) [0 x 804853 c] 35. PLEs Vs 83 -> P 1 [T](X 86 Addr: 0 x 8048545) …………………………………… провал ***** 0 xf 638. 25760 ***** Формат 16 бит ! 35. CCTOLP CCTOPLE(0), %br 6<%R 2>(0 x. . )->%bp 1<%P 1>(1)[0 x 8048545] …………………………………………
Пример 2 на не сличение контекста (lsim_trap) и перестановку местами контрольных точек Неправильная трасса кода полученного отлаживаемым компилятором Ошибка восстановления контекста: ***** 0 x 87 b 8. 9540931 ***** ! context is damaged at 30048(0 x 7560), [ 1177. SRP <1175> (1) (x 86 addr: 0 x 80481 ea) (cc_addr: 0 x 8 cf 8) ] \ SRP 1 eip: 0 x 80481 f 4, srp_prev: 0 x 87 b 9 [ 921. SRP <1258> (1) (x 86 addr: 0 x 80481 f 4) (cc_addr: 0 x 96 a 8) ] \ SRP 2 srp_curr: 0 x 87 b 9 HS 0 d 0001024 : ! edx(g 13): prev 0 x 8040224 curr 0 x 8030 e 7 a SS 0 0 c 000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) … ALS 2 0 3 e 93 d 098 1175. STSSW %r 24<%R 208> (1) -> SS(…) […] [0 x 80481 e 7] ALS 4 0 5 cc 01411 1154. MOVFI %xbr 20<%R 36> (…) -> %br 17<%R 33> (0 x. . ) До планирования: ALS 5 0 2 fa 99 e 11 1258. STDSD %dbr 17<%R 33> (0) -> DS(…) […] [0 x 80481 f 1] 1258. STDSD <921>. . (X 86 Addr: 0 x. . ) Псевдо прерывание 921. SRP <1258>. . (X 86 Addr: 0 x. . ) …………………. . Enter in COMP CODE of [921. SRP<1258>(x 86 addr: 0 x 80481 f 4)(cc_addr: 0 x 96 a 8)] 1175. STSSW <1177>. . (X 86 Addr: 0 x. . ) 1177. SRP <1175>. . (X 86 Addr: 0 x. . ) ***** 0 x 96 a 8. 9541641 ***** …………………. . ***** 0 x 2 b 5 b 0. 9542901 ***** После планирования: HS 0 04100011 : 5 1258. STDSD <921>. . (X 86 Addr: 0 x. . ) ALS 0 0 6780 c 0 e 0 LDGDD GD(…) […] -> %dg 13<%G 13> (0 x 8030 e 7 a) 0 921. SRP <1258>. . (X 86 Addr: 0 x. . ) …………………. . LSIM_TRAP: ОШИБКА!!! 2 1175. STSSW <1177>. . (X 86 Addr: 0 x. . ) Правильная трасса кода полученного эталонным компилятором 0 1177. SRP <1175>. . (X 86 Addr: 0 x. . ) ***** 0 x 87 b 8. 9540931 ***** [ 921. SRP <1258> (1) (x 86 addr: 0 x 80481 f 4) (cc_addr: 0 x 96 a 8) ] \ SRP 2 [ 1177. SRP <1175> (1) (x 86 addr: 0 x 80481 ea) (cc_addr: 0 x 8 cf 8) ] \ SRP 1 И окончательно (по шир. командам): HS 0 d 0001024 : 2 1175. STSSW addr=<0 x 87 b 8> s SS 0 0 c 000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) abg(0) …. 2 1177. SRP cc_addr=<0 x 8 cf 8> s ALS 2 0 2 fa 99 e 11 1258. STDSD %dbr 17<%R 33> (0) -> DS(…) […] [0 x 80481 f 1] 5 1258. STDSD s ALS 4 0 5 cc 01411 1154. MOVFI %xbr 20<%R 36> (…) -> %br 17<%R 33> (0 x. . ) 5 921. SRP cc_addr=<0 x 96 a 8> s ALS 5 0 3 e 93 d 098 1175. STSSW %r 24<%R 208> (1) -> SS(…) […] [0 x 80481 e 7] Enter in COMP CODE of [ 1177. SRP <1175> (1) (x 86 addr: 0 x 80481 ea) (cc_addr: 0 x 8 cf 8) ] ***** 0 x 8 cf 8. 9541529 ***** …………………………………………………. . ***** 0 x 2 b 600. 9542906 ***** HS 0 04100011 : ALS 0 0 6780 c 0 e 0 LDGDD GD(…) […] -> %dg 13<%G 13> (0 x 8040224)
Результаты поведённой работы. Изученный материал: • Особенности VLIW архитектуры Эльбрус 2000. Структура широкой команды. • Структура системы двоичной оптимизирующей трансляции • Стадии обработки входного кода двоичного оптимизирующего компилятора • Операционная семантика промежуточного представления и граф потока управления в двоичном оптимизирующем компиляторе • Понятие контрольной точки и восстановление Intel x 86 контекста • Режим интерпретации lsim_trap 1. Выявлены основные различия между представлением семантики в трассе результирующего исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 и промежуточным представлением двоичного оптимизирующего компилятора: Intel x 86 код – код Эльбрус 2000, а также важная с точки зрения анализа разработчиком при отладке результирующего кода информация из промежуточного представления компилятора, которая отсутствует в трассе исполнения. 2. По результатам анализа из предыдущего пункта разработано средство отладки двоичного оптимизирующего компилятора Intel x 86 -> Эльбрус 2000, позволяющее представить результат исполнения откомпилированной программы (трассу) в терминах промежуточного представления компилятора. 3. Разработанное средство представляет из себя программу, написанную на языке С и запускаемую из командной строки в операционной системе Linux. 4. Программа обрабатывает трассу исполнения кода, полученного после компиляции любого кода платформы Intel x 86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x 86 контекста. Разработанное средство используется при отладке промышленного двоичного оптимизирующего компилятора в фирме МЦСТ.
66fca92a67dccee4ae53436ab7c99844.ppt