Потоковые локальные переменные и встроенная сборка - PullRequest
3 голосов
/ 11 января 2012

Я пытаюсь использовать локальную переменную потока во встроенной сборке, но когда я вижу дизассемблированный код, оказывается, что компилятор не генерирует правильный код.Для следующего встроенного кода, где сохраненный_сп равен глобально объявлен как __thread long saved_sp,

__asm__ __volatile__ (
        "movq %rsp, saved_sp\n\t");

Разборка выглядит следующим образом.

mov    %rsp,0x612008

Что явно не так, потому что я знаю, что gcc использует сегмент fs для локальных переменных потока.Он должен был сгенерировать что-то вроде

mov %rsp, fs:somevalue

, но это не так.Почему это так?Использование локальных переменных потока во встроенной сборке проблематично?

1 Ответ

4 голосов
/ 11 января 2012

Простая вещь, которая наверняка сработает, - это взять указатель на локальную переменную потока и записать в нее.
Ваш компилятор обязательно сделает long *saved_fp_p = &saved_fp правильно, а встроенная сборка будет работать только с saved_fp_pэто локальная переменная.

Вы также можете использовать синтаксис ввода и вывода gcc:

__asm__ __volatile__ (
    "mov %%rsp, 0(%0)" : : "r" (&saved_sp)
);

Это дает компилятору ответственность за разрешение адреса save_fp, и код сборки получает егов регистре.

Мы выяснили, что это тоже работает,

__asm__ __volatile__ asm ("mov %rsp,%0" : "=m" (saved_sp))
...