Agenda
Toolchain
Compiler structure
.c
.cpp
.f77
...
.c
.cpp
.F
...
High-Level IR
High-Level IR
High-Level IR
Low-Level
IR
Low-Level
IR
Low-Level IR
asm
.o
.obj
.out
.exe
1
2
4
5
6
1.Препроцессор
2.Front-End
3.Оптимизации
4.Кодогенератор
5.Ассемблер
6.Линкер
++ Можно проследить запуски фаз компиляции (опция ‘--verbose’ в GCC)
Preprocessing
Триграф
значение
??(
[
??)
]
??<
{
??>
}
??=
#
??/
\
??'
^
??!
|
??-
~
/??/
*
*/ # /*
*/ defi\
ne FO\
O 10\
20
#define FOO 1020
a = i+++j;
a = (i++) + j;
a = i + (++j);
Preprocessing
Триграф
значение
??(
[
??)
]
??<
{
??>
}
??=
#
??/
\
??'
^
??!
|
??-
~
/??/
*
*/ # /*
*/ defi\
ne FO\
O 10\
20
#define FOO 1020
a = i+++j;
a = (i++) + j;
a = i + (++j);
Compiler
++ Можно проследить результат работы компилятора после каждой фазы
(опции ‘--dump-tree-all --dump-rtl-all’ в GCC)
D.26 = b * 5;
a1 = D.26 - c;
27 = b * -4;
D.28 = D.27 + c;
a2 = D.28 * 2;
D.20 = a1 * 2;
D.29 = D.20 + a2;
return D.29;
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
leal (%rdi,%rdi), %eax
ret
.cfi_endproc
Code transformation
++ Бывает полезно посмотреть ассемблерный код (опция ‘-S’ в GCC)
Source code
AST
High-level IR
Low-level IR
assembler
a1
-8
a2
a1
a2
ret
set (reg:SI 62)
(ashift:SI (reg/v:SI 60 [ b ])
(const_int 1 [0x1]);
set (reg/i:SI 0 ax)
(reg:SI 62);
Assembler
mov eax, ebx
Intel
movl %ebx, %eax
AT&T
Имена регистров зарезервированы
Сначала dst, потом src
Регистры начинаются с %
b, w, l, q – размер операнда
Linker
int G1 = 1;
int G2;
extern int G3;
extern int f( int*);
int g( int n) {
int* h = malloc(n*sizeof(int));
f( h);
return h[ G2 ];
}
bss: 000...00
data
code
heap
bss
data
code
file
memory
stack
Динамическая линковка
Dynamic Linking
movl %edx, %esi
movq %rax, %rdi
call f@PLT
movq G2@GOTPCREL(%rip), %rax
movl (%rax), %eax
cltq
movl %edx, %esi
movq %rax, %rdi
call f
movl G2(%rip), %eax
сltq
call f
…
LPT
f:??
a.out
libname lib
function f
ld.so
LPT
f:0x…
f()
lib.so
Other binutils
_ZGVZN15UICmdWithParser11parseMemoryEPPKcmRmP7ProgramP7MachineS3_RNS_15uiParserWidth_tEE8reMemory
UICmdWithParser::parseMemory(char const**, unsigned long, unsigned long&, Program*, Machine*, unsigned long&, UICmdWithParser::uiParserWidth_t&)::reMemory
Libraries
Библиотеки
Libraries
Creating/Poring TC
…
…
Входные языки
Целевые платформы
SUN
Compiler
MS
Compiler
GCC
LLVM
EDG Front-End
Intel
compiler
Elbrus
compiler
CG1
CG2
C++
C
F77
Простой пример
Example
Описание Машины
Machine Description (MD)
Цикл работы компилятора
???(MD)
Структура описания в GCC
GCC description structure
Двоичный интерфейс приложения
ABI
caller
f()
callee
g()
Портирование Библиотек
Library Porting
Симулятор
Simulator
Debugging tools
framework
Valgrind
Valgrind
X86
PPC
…
Build IL
IL
Code gen
init IL
Instrumented IL
Tool
Memcheck – проверка памяти
Cachegrind – профиль кэша
Callgrind – профиль кэша+кода
Massif – профиль кучи
Helgrind – анализ многопоточности
Lackey – кол-во инструкций и BB
TreadSanitizer – новое от Google
Анализ производительности
Performance Analysis
Пример профиля
Profile example
Место в профиле
Собств.
время
Время
потомков
Общее число вызовов
Откуда вызвали
Сколько вызвали отсюда
Листовая функция, вызывается из одного места в огромном цикле
Executable Formats
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть