Как избежать перевода меток при использовании встроенной сборки в компиляторе XLC? - PullRequest
2 голосов
/ 03 апреля 2012

При использовании встроенной сборки с компилятором XLC (для powerpc) метки переводятся, и в результате невозможно узнать окончательное имя метки для переходов.Пример:

int main()
{
    __asm__("mylabel:");      
    __asm__("nop");
    __asm__("b mylabel");
}

Если я скомпилирую предыдущий код, используя GCC, все работает как положено.Однако при использовании XLC сгенерированная сборка выглядит следующим образом:

...
.L1
nop
b mylabel
...

Очевидно, что программа не может быть скомпилирована, поскольку «mylabel» никогда не определяется.Определение «mylabel» автоматически переводится на имя «.L1».На самом деле это имя зависит от количества определенных локальных меток.Таким образом, это могут быть ".L1", ".L2" ...

Я пытался использовать asm, __asm ​​вместо __asm__, но получаю тот же вывод.Отключение оптимизации компилятора также не работает.Кто-нибудь знает, как сохранить локальные имена меток при генерации сборки в XLC?Любой другой обходной путь тоже поможет.

Спасибо,

1 Ответ

1 голос
/ 05 апреля 2012

Это говорит Branching to a label in another asm statement is not supported.

Попробуйте поместить весь свой встроенный код сборки в один оператор __asm__ что-то вроде:

    __asm__("mylabel:\n"
            "nop\n"
            "b mylabel");
...