Здравствуйте.
Подскажите, для чего используется RTL (почему нельзя обойтись без него)?
Почему он такой сложный (если смотреть дамп после компиляции)?
Где можно подробно прочитать про то, как происходит оптимизация RTL на разных проходах?
При компиляции простого файла a.c версией gcc-2.96
(gcc -dr -c a.c):
int a(void) {
return 5;
}
получается следующий дамп:
;; Function a
(note 2 0 3 NOTE_INSN_DELETED 0)
(note 3 2 9 NOTE_INSN_FUNCTION_BEG 0)
(insn 9 3 10 (set (reg/i:SI 0 eax)
(const_int 5 [0x5])) -1 (nil)
(nil))
(jump_insn 10 9 11 (set (pc)
(label_ref 16)) -1 (nil)
(nil))
(barrier 11 10 13)
(note 13 11 15 NOTE_INSN_FUNCTION_END 0)
(insn 15 13 16 (clobber (reg/i:SI 0 eax)) -1 (nil)
(nil))
(code_label
16 15 17 2 "" "" [0 uses])
(insn 17 16 0 (use (reg/i:SI 0 eax)) -1 (nil)
(nil))
Вопросы: 1. Почему после инструкции с номером 3 сразу же следует с номером 9?
Почему такая нумерация или какие-то инструкции просто не были выведены?
2. Опция -dr распечатывает дамп после преобразования синтаксического дерева в RTL,
почему тогда присутствует строка (note 2 0 3 NOTE_INSN_DELETED 0)?
3. В 10 инструкции передача управления осуществляется на 16 инструкцию, а для чего тогда нужны 11,13,15?
4. В 15 инструкции указано clobber, что говорит компилятору, что значение может быть испорчено в этом регистре, но при этом указывается, что регистр используется для возврата значения функции, а 17 инструкция сообщает, что значение из регистра тут используется. Игнорируется ли clobber?
5. Куда происходит выход из функции?