120 likes | 323 Views
Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ) Разработка средства анализа трассы исполнения двоично-транслированной программы в терминах промежуточного представления компиляции. Квалификационная бакалаврская работа студента 112 группы
E N D
Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ) Разработка средства анализа трассы исполнения двоично-транслированной программы в терминах промежуточного представления компиляции. Квалификационная бакалаврская работа студента 112 группы Факультета Радиотехники и Кибернетики Загребина Андрея Александровича Научный руководитель: Старший научный сотрудник Масленников Дмитрий Михайлович Москва, 2005
Описание проблемы отладки двоичного оптимизирующего компилятора: Intel x86 код – код Эльбрус 2000 Процесс отладки: Интерпретатор Архитектуры Эльбрус 2000 Intel x86 код Исполняемый код Эльбрус 2000 Двоичный оптимизи- рующий компилятор Исполнение Сильное различие ! Dump-файл Информация о компиляции Промежуточное представление Trace-файл Трасса исполнения Информация о выполненных командах Ошибки исполнения Нехватка информации о компиляции Необходимость сопоставления информации вручную ! Ошибки восстановления x86 контекста Выявление Причин Ошибок Исправление ошибок В связи с возникшей задачей было поставлено следующее техническое задание.
Техническое задание. • Выявить основные различия между представлением семантики в трассе результирующего • исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 • и промежуточным представлением двоичного оптимизирующего компилятора: • Intel x86 код – код Эльбрус 2000, а также важную с точки зрения анализа разработчиком при • отладке результирующего кода информацию из промежуточного представления компилятора, • которая отсутствует в трассе исполнения. 2. По результатам анализа из предыдущего пункта разработать средство отладки двоичного компилятора Intel x86 -> Эльбрус 2000, позволяющего представить результат исполнения откомпилированной программы (трассу) в терминах промежуточного представления компилятора. • Разрабатываемое средство должно представлять из себя программу, запускаемую • из командной строки в операционной системе Linux. 4. Программа должна обрабатывать трассу исполнения кода, полученного после компиляции любого кода платформы Intel x86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x86 контекста.
Оптимизирующий двоичный компилятор. Intel x86 код, информация о регионах, профильная информация начальная (front end) Синтаксический Семантический разбор Фазы анализа промежуточного представления … Фаза анализа управления … Фазы оптимизаций … Генер. кода опт. Код E2K первичная генерация и частичная оптимизация Граф потокауправления Control Flow Graph (CFG) Промежуточное Представление (IR) Аналитические Структуры данных … Операционная семантика … Узлы CFG (Линейные участкикода) Enter Op 1, Op2 … переход … Абстрактные ОПЕРАЦИИ компилятора Enter Op 1 Op2 … переход Enter Op 1, Op2 … переход x86 адрес соответствующей x86 операции Номер операции … Аргументы операции Enter Op 1, Op2 … переход Имя операции Обратная дуга Цикл …
Понятия контрольной точки и контекста. • Обработка любого возникшего прерывания без его потери!!! • Последующее восстановление x86 контекста!!! Восстанавливаемый Невосстанавливаемый В компиляторе: (интеловская память) ……………………………… T=7 <0002f8> 5 1258. STDSB <921> … [P1](X86Addr: 0x80481f1) ……………………………… T=7 <0002f8> 0 921. SRP <1258> ... [P1] (X86Addr: 0x80481f4) cc_addr=<0x96a8> ……………………………… Прерывание обработка Компенсирующий код (восстанавливает x86 контекст) поставить контрольную точку В трассе (для архитектуры Эльбрус 2000): SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … В регистре RPR хранится адрес компенсирующего кода Для проверки механизма восстановления x86 контекста создан специальный вид интерпретатора lsim_trap, который сам генерирует псевдо - прерывания.
Dump-файл Дизассемблер Эльбрус 2000 Содержит список операций промежуточного представления информацию компиляции о них и их планирование по тактам: 0000<0xa880> HS 0000c012 804834d_1_region: CS0 4000000c disp %ctpr1, M_a8e0 CS1 0c5fcfe0 setwd wsz = 0x60, nfx = 0x0 setbn rsz = 0x3f, rbs = 0x20, rcur = 0x3c setbp psz = 0x17 LTS0 00000c00 ……………………………… // ТЕЛО 0007<0xa8b8> HS 9c041023 : SS 80000440 ct %ctpr1 ? %pred3 ipd 2 ALS0 10c0e09a adds,3 0, %g0, %r26 ALS1 0016d014 ands,2 %b[22], _f16,_lts0lo 0xff, %b[20] ALS2 2ec0d8af stdsw,2 %r47, [ _f32,_lts0 0x804a074 ] ALS5 2cc0d808 stdsb,2 %b[8], [ _f32,_lts0 0x804a016 ] PLS0 61622260 pass %pred1, @p0 pass %pred2, @p1 andp ~@p0, ~@p1, @p4 pass @p4, %pred0 Scheduled IRE2K of … T=0 <000000> 0 1. ENTER (X86Addr:0x804834d) T=0 <000000> 1 605. SETWD 0x6000000 (X86Addr: 0x0000000) T=0 <000000> 1 606. SETBN 0x1778fe0 (X86Addr: 0x0000000) T=0 <000000> 0 943. CTPD <two> 6.-> C0 (X86Addr: 0x0000000) T=0 <000000> 1 607. SETBP 0x1778fe0 (X86Addr: 0x0000000) ……………………………… // ТЕЛО T=7 <0001e8> 0 627. MOVs Gs0 -> Rs26 (X86Addr: 0x8048153) T=7 <0002f8> 5 1258. STDSB <921> …(X86Addr: 0x80481f1) T=7 <0002f8> 0 921. SRP <1258> ... (X86Addr: 0x80481f4) T=7 <0002f8> 2 1175. STDSW <1177> … (X86Addr: 0x80481e7) T=7 <0002f8> 0 1177. SRP <1175> ... (X86Addr: 0x80481ea) T=7 <000200> 1 690. ANDs Bs3 0xff -> Bs2 (X86Addr: 0x8048161) T=7 <000260> 0 681. CLPAND BP1[F] BP2[F]->BP0[T](X86..:0x0.) T=7 <000038> 0 614. BRANCH.c C0 BP3[T](X86Addr:0x0000000) T=7 <000038> 0 590. END (X86Addr: 0x0000000) Oper2CodeInfo … T=0 U=0 1. ENTER addr=<0xa880> - Node 1 (loop 0) T=0 U=1 605. SETWD - s T=0 U=1 606. SETBN - s T=0 U=0 943. CTPD - s T=0 U=1 607. SETBP - s ……………………………… // ТЕЛО T=7 U=5 1258. STDSB addr=<0xa8b8>- s T=7 U=2 1175. STDSW - s T=7 U=0 627. MOVs - s T=7 U=1 690. ANDs - s T=7 U=2 1177. SRP cc_addr=<0x8cf8> s T=7 U=5 921. SRP cc_addr=<0x96a8> s T=7 U=0 681. CLPAND - s T=7 U=0 614. BRANCH - s T=7 U=0 590. END - s Trace-файл ***** 0xa8b8.8353 ***** HS 0 9c041023 :CT %ctpr1(0xa880)t.p.%bp3<%P3>(1) SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … ALS0 0 10c0e09a ADDs(0), %g0<..> (0x..)->%r26<..>.. ALS1 0 0016d014 ANDs%br22<..>(0x..),(0x..)->%br20… ALS2 0 2ec0d8af STDSW %r47<%R57> (0x23f) -> .. ALS5 0 2c0d808 STDSB %br8<%R74> (0x57) -> .. PLS0 0 61622260 PASS %bp1<%P1> (0) -> @p0 (0) PASS %bp2<%P2> (1) -> @p1 (1) CLPAND ~@p0, ~@p1 -> @p4 %bp0<%P0> (0) ***** 0xa880.8354 ***** HS 0 0000c012 : CS0 0 4000000c BRANCH %ctpr1 (0xa8e0) CS1 0 0c5fcfe0 SETR0 setbp(1) setbn(1) settr(0) .. LTS0 0 00000c00 type(0) rpsz(0) wsz(0x60) nfx(0) x(0) ……………………………… // ТЕЛО
Анализ различий промежуточного представлениякомпиляции и трассы исполнения (dump- и trace-файлов). В результате проведённого анализа были обнаружены следующие отличия. В трассе исполнения не хватает следующей информации о компиляции в терминах IR кода: • Номеров операций в широких командах. • Номеров узлов, в которых находятся широкие команды, • встречаемые в трассе. • (его имеет смысл ставить у команды только, • если предыдущая команда находится в другом узле) • У операций ненулевого x86 адреса • (т.е. если операция не добавлена искусственно компилятором) • соответствующих им операций Intel x86 архитектуры. • Номера одной или двух операций SRP в широкой команде • Номера операции, с которой связанна стоит данная SRP • Адресов компенсирующих кодов, • соответствующих исполнившимся операциям SRP А также информации, которую разработчику приходится находить вручную: • Число итераций цикла • Направление перехода в управляющем графе, • т.е. номер узла, в который осуществляется переход • Флага исполнения конкретной операции SRP • (в трассе есть только флаг исполнения одной из операций SRP) • Признака начала исполнения компенсирующего кода последней SRP
Реализация Средства dtlink. Исполняемый код Эльбрус 2000 Программа написана на языке С и запускается с командной строки операционной системы Linux. Двоичный оптимизи- рующий компилятор Исполнение • Разработанное средство • производит следующие • действия: • Разбирает выдачу компилятора • Собирает информацию • о компиляции • Разбирает трассу • исполнения кода • Получает отсутствующую • в трассе информацию • об исполнении • Вставляет в новую трассу • - старую трассу • - всю собранную информацию • Выдаёт новую трассу Сильное различие ! Trace-файл Трасса исполнения Информация о выполненных командах Dump-файл Информация о компиляции Промежуточное представление Разработанное Средство dtlink Новый Trace-файл Трасса исполнения Информация о выполненных командах в терминах компилятора и исполнения Выявление Причин Ошибок
Результат работы средства dtlink. Модифицированный trace-файл. ***** 0xa8b8.8353 ***** [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr: 0x8cf8 ) ] [ 921. SRP <1258> (1) (x86addr: 0x80481f4 ) (cc_addr: 0x96a8) ] HS 0 9c041023614.:CT %ctpr1(0xa880)tak.pred.%bp3<%P3>(1) Node 1 [0x0000000] SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) vfdi(0) … ALS0 0 10c0e09a 627. ADDs (0), %g0<%G0> (0x..) -> %r26<%R36> (0x..)[0x8048153] ALS1 0 0016d014 690. ANDs %br22<%R88> (0x..), (0x..) -> %br20<%R86>(0x..)[0x8048161] ALS2 0 2ec0d8af 1175. STDSW %r47<%R57> (0x23f) -> DS(..) [..] [0x80481e7] ALS5 0 2cc0d808 1258. STDSB %br8<%R74> (0x57) -> DS(..) [..] [0x80481f1] PLS0 0 61622260 681. PASS %bp1<%P1> (0) -> @p0 (0) [0x0000000] PASS %bp2<%P2> (1) -> @p1 (1) CLPAND ~@p0, ~@p1 -> @p4 %bp0<%P0> (0) ***** 0xa880.8354 ***** Node 1. 5 (1. Enter 0x804834d) HS 0 0000c012 : CS0 0 4000000c 943. BRANCH %ctpr1 (0xa8e0)[0x0000000] CS1 0 0c5fcfe0 605. SETR0 setbp(1) setbn(1) settr(0) .. [0x0000000] LTS0 0 00000c00 type(0) rpsz(0) wsz(0x60) nfx(0) x(0) ……………………………… // ТЕЛО //Прерывание !!! ………………………………//Вызов компенсирующего кода Enter in COMP CODE of [ 921. SRP <1258> (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] ***** 0x96a8.9541641 *****……………………….. • При сравнении • трассы откомпилированного кода • итрассы эталонного кода • Сразу видно: • - Отличие числа итераций • неправдоподобно большое • число итераций Ошибки связанные с циклами неправильное построение условия выхода получение неправильного условия выхода в процессе итерации
Пример 1 на падение интерпретатора lsim из-за ошибки преобразования операций. Неправильная трасса кода полученного отлаживаемым компилятором Intel x86 code: 804852a: andw $0xff00,0x804a05a 8048533: subw $0x300, 0x804a05a 804853c: cmpw $0x3a00,0x804a05a 8048545: jle 8048578 ***** 0xe738.21718 ***** Node 7.0 27. !ANDs %br3<%R197>(0x..),(0x..)->%br5<%R199>(0x..)[0x804852a] ………………………………………………………………………………… ***** 0xe748.21719 ***** 31. !SUBs %br5<%R199>(0x..),(0x..)->%br3<%R197>(0x..)[0x8048533] ………………………………………………………………………………… ***** 0xe758.21720 ***** 115.!CMPLEs %br3<%R197>(0x..), (0x...)->%bp1<%P1>(0)[0x0000000] ………………………………………………………………………………… ***** 0xe758.21720 ***** 11.:CT %ctpr1 (0xe820) tak.pred. ~%bp1<%P1>(0) Node 3 [0x8048545] ………………………………………………… ***** 0xe820. 21727 ***** Node 3.0 ………………………………………………………………………………… 264. UDIVX %dr29<%R39> (0x..), (0x..) -> %br66<%R132> [0x8048578] ………………………………………………………………………………… exc_div: ( division by 0 or the quotient is too large ). После c2do во фрагменте 804851c: • 25. LDDSH 0 .. -> Vs76 (X86Addr: 0x804852a) • 27. ANDs Vs76 .. -> Vs78 (X86Addr: 0x804852a) • 31. SUBs Vs78 .. -> Vs81 (X86Addr: 0x8048533) • 115. CMPLEs Vs81 .. -> P1 [T](X86Addr: 0x0000000) • .. • BRANCH.c C0 BP1[F] (X86Addr:0x8048545) • .. • 264. UDIVX Vs141 .. -> Vs56> (X86Addr:0x8048578) • .. переход Формат 32 бита ! Правильная трасса кода полученного эталонным компилятором До c2do во фрагменте 804851c: ***** 0xf5d8.25755 ***** 27. ANDs %br8<%R74>(0x..),(0x..)->%br5<%R1>(0x..)[0x804852a] ………………………………………………………………………………… ***** 0xf600.25757 ***** 31.SUBs %br7<%R3>(0x..),(0x..)->%br10<%R76>(0x..)[0x8048533] ………………………………………………………………………………… ***** 0xf628.25759 ***** 34.SUBs FLH %br6<%R2>(0x..), (0x..)->%br6<%R2>(0x..)[0x804853c] ………………………………………………………………………… ***** 0xf638.25760 ***** 35.CCTOLP CCTOPLE(0),%br6<%R2>(0x..)->%bp1<%P1>(1)[0x8048545] ………………………………………………………………………………… 27. ANDs Vs76 .. -> Vs78 (X86Addr: 0x804852a) ... 29. ANDs Vs78 .. -> Vs79 (X86Addr: 0x8048533) 31. SUBs Vs79 .. -> Vs81 (X86Addr: 0x8048533) ... 33. ANDs Vs81 .. -> Vs82 (X86Addr: 0x804853c) 34. SUBfh Vs82 .. -> Vs83 (X86Addr: 0x804853c) 35. PLEs Vs83 -> P1 [T](X86Addr: 0x8048545) провал Формат 16 бит !
Пример 2 на не сличение контекста (lsim_trap) и перестановку местами контрольных точек Неправильная трасса кода полученного отлаживаемым компилятором Ошибка восстановления контекста: ! context is damaged at 30048(0x7560), eip: 0x80481f4, srp_prev: 0x87b9 srp_curr: 0x87b9 ! edx(g13): prev 0x8040224 curr 0x8030e7a ***** 0x87b8.9540931 ***** [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] \\ SRP 1 [ 921. SRP <1258> (1) (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] \\ SRP 2 HS 0 d0001024 : SS 0 0c000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) … ALS2 0 3e93d0981175. STSSW %r24<%R208> (1) -> SS(…) […] [0x80481e7] ALS4 0 5cc01411 1154. MOVFI %xbr20<%R36> (…) -> %br17<%R33> (0x..) ALS5 0 2fa99e11 1258. STDSD %dbr17<%R33> (0) -> DS(…) […] [0x80481f1] Псевдо прерывание ………………….. ………………….. Enter in COMP CODE of [921.SRP<1258>(x86addr: 0x80481f4)(cc_addr: 0x96a8)] ***** 0x96a8.9541641 ***** ………………….. ………………….. ***** 0x2b5b0.9542901 ***** HS 0 04100011 : ALS0 0 6780c0e0 LDGDD GD(…) […] -> %dg13<%G13> (0x8030e7a) ………………….. ………………….. LSIM_TRAP: ОШИБКА!!! До планирования: 1258. STDSD <921> .. (X86Addr: 0x..) 921. SRP <1258> .. (X86Addr: 0x..) 1175. STSSW <1177> .. (X86Addr: 0x..) 1177. SRP <1175> .. (X86Addr: 0x..) После планирования: 5 1258. STDSD <921> ..(X86Addr: 0x..) 0 921. SRP <1258>..(X86Addr: 0x..) 2 1175. STSSW <1177>..(X86Addr: 0x..) 0 1177. SRP <1175>..(X86Addr: 0x..) Правильная трасса кода полученного эталонным компилятором ***** 0x87b8.9540931 ***** [ 921. SRP <1258> (1) (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] \\ SRP 2 [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] \\ SRP 1 HS 0 d0001024 : SS 0 0c000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) abg(0) …. ALS2 0 2fa99e11 1258. STDSD %dbr17<%R33> (0) -> DS(…) […] [0x80481f1] ALS4 0 5cc01411 1154. MOVFI %xbr20<%R36> (…) -> %br17<%R33> (0x..) ALS5 0 3e93d098 1175. STSSW %r24<%R208> (1) -> SS(…) […] [0x80481e7] Enter in COMP CODE of [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] ***** 0x8cf8.9541529 ***** …………………………………………………………………………………………………….. ***** 0x2b600.9542906 ***** HS 0 04100011 : ALS0 0 6780c0e0 LDGDD GD(…) […] -> %dg13<%G13> (0x8040224) И окончательно (по шир. командам): 2 1175. STSSW addr=<0x87b8> s 2 1177. SRPcc_addr=<0x8cf8> s 5 1258. STDSD - s 5 921. SRP cc_addr=<0x96a8> s
Результаты поведённой работы. • Изученный материал: • Особенности VLIW архитектуры Эльбрус 2000. Структура широкой команды. • Структура системы двоичной оптимизирующей трансляции • Стадии обработки входного кода двоичного оптимизирующего компилятора • Операционная семантика промежуточного представления и граф потока управления • в двоичном оптимизирующем компиляторе • Понятие контрольной точки и восстановление Intel x86 контекста • Режим интерпретации lsim_trap • Выявлены основные различия между представлением семантики в трассе результирующего • исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 • и промежуточным представлением двоичного оптимизирующего компилятора: • Intel x86 код – код Эльбрус 2000, а также важная с точки зрения анализа разработчиком при • отладке результирующего кода информация из промежуточного представления компилятора, • которая отсутствует в трассе исполнения. • По результатам анализа из предыдущего пункта разработано средство отладки двоичного • оптимизирующего компилятора Intel x86 -> Эльбрус 2000, позволяющее представить • результат исполнения откомпилированной программы (трассу) • в терминах промежуточного представления компилятора. • Разработанное средство представляет из себя программу, написанную на языке С и • запускаемую из командной строки в операционной системе Linux. 4. Программа обрабатывает трассу исполнения кода, полученного после компиляции любого кода платформы Intel x86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x86 контекста. Разработанное средство используется при отладке промышленного двоичного оптимизирующего компилятора в фирме МЦСТ.