Search
Write a publication
Pull to refresh
17
0
Георгий Лебедев @CuriousGeorgiy

Программист в команде разработки ядра Tarantool

Send message

Теперь я, кажется, осознал Ваш вопрос (не обратил внимание на слово формат в самом начале).

Дело в том, что если посмотрите на код, который я привожу — при сборе стектрейса мы вручную сохраняем состояние файбера, поэтому от используемой библиотеки фактически ничего не зависит.

В первом случае "rbp, rbx, r15, r14, r13, r12", во втором "rbp, rbx, r12, r13, r14, r15".

Так Вы вроде перечислили одинаковый набор регистров?

Для меня не так очевидно :)

Состояние файбера (исполняемого контекста) — это состояние машины, поэтому набор сохраняемых регистров всегда одинаковый при прочих равных (платформа, операционная система).

Отличный вопрос! Я как раз забыл об этом упомянуть и прикрепить соответствующие ссылки.

От используемой библиотеки, очевидно, не зависит. Вот например, для Linux x86_64:

Не совсем понимаю, что Вы имели в виду под рантаймом, но от операционной системы и архитектуры действительно зависит. Вот, например, для Windows x86_64 всё по-другому (Tarantool под Windows не поддерживается):

https://github.com/boostorg/context/blob/f1adb9261ff0f3382132c497afa80d37e8604aa8/src/asm/jump_x86_64_ms_pe_gas.asm#L100-L140 — boost.context

PS: DWARF на win-машинках куда менее распростанён, хотя вроде как и никто не мешает закинуть DWARF-секцию в PE.

Про Windows не могу ничего сказать: забыл повесить дисклеймер в начале статьи, что речь идет о Unix системах — Tarantool только на них поддерживается.

"Нити" скорее про потоки, и то я бы не сказал, что даже тут устоялось — по крайней мере, в моем окружении все говорят "треды".

Привет!

@xhinhellhxвсё правильно написал. Проиллюстрирую на примере OP_Column: оборачиваем этот switch-case в функцию, добавляем её в бутстрап-модуль LLVM, загружаем её сигнатуру оттуда, и, наконец, генерируем вызовы к ней, когда JIT-компилируем OP_Column'ы.

Добавлю от себя ещё, что помимо сшития (избавления от интрукций перехода) машинного кода, который дает inlining, есть возможность использовать оптимизационные проходы LLVM — за счет динамической информации об аргументах callbaсk'ов (сейчас понял, что тут этот термин действительно немного не к месту здесь), помимо прочего, можно убирать целые ветки кода (читай: constexpr if statement). Причем при таком подходе результат получается автоматически.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity

Specialization

System Software Engineer
Middle
Database
Algorithms and data structures
System Programming
Assembler
Code Optimization
C++
C
Git
Linux
Low-level programming