У меня есть функция C++, которая определяет несколько меток и пытается вычислить целевой адрес на основе входного значения. Затем функция использует оператор goto для перехода к вычисленному адресу. Однако когда я компилирую этот код с помощью GCC или Clang, он использует только первые две метки. (обозреватель компилятора)
Почему GCC и Clang не могут правильно скомпилировать этот код и как это исправить? Такое поведение соответствует стандарту C++ или это ошибка компилятора? Должен ли я сообщить об этом?
#include
#include
#include
uint8_t SWARfloor64OverNGoto(const uint64_t n)
{
// Define the labels
void *label0_address = &&label0;
void *label1_address = &&label1;
// Calculate the offset at compile time
const uint64_t offset = reinterpret_cast(label1_address) - reinterpret_cast(label0_address);
// Compute the target address
void *target = reinterpret_cast(reinterpret_cast(label0_address) + n * offset);
// Jump to the target address
goto *reinterpret_cast(target);
label0:
return 0;
label1:
return 64;
label2:
return 32;
label3:
return 21;
label4:
return 16;
label5:
return 12;
label6:
return 10;
label7:
return 9;
label8:
return 8;
label9:
return 7;
label10:
return 6;
label11:
return 5;
label12:
return 5;
label13:
return 4;
label14:
return 4;
label15:
return 4;
label16:
return 4;
label17:
return 3;
label18:
return 3;
label19:
return 3;
label20:
return 3;
label21:
return 3;
label22:
return 2;
label23:
return 2;
label24:
return 2;
label25:
return 2;
label26:
return 2;
label27:
return 2;
label28:
return 2;
label29:
return 2;
label30:
return 2;
label31:
return 2;
label32:
return 2;
label33:
return 1;
label34:
return 1;
label35:
return 1;
label36:
return 1;
label37:
return 1;
label38:
return 1;
label39:
return 1;
label40:
return 1;
label41:
return 1;
label42:
return 1;
label43:
return 1;
label44:
return 1;
label45:
return 1;
label46:
return 1;
label47:
return 1;
label48:
return 1;
label49:
return 1;
label50:
return 1;
label51:
return 1;
label52:
return 1;
label53:
return 1;
label54:
return 1;
label55:
return 1;
label56:
return 1;
label57:
return 1;
label58:
return 1;
label59:
return 1;
label60:
return 1;
label61:
return 1;
label62:
return 1;
label63:
return 1;
}
Скомпилированный ассемблерный код использует только первые две метки, что не является запланированным.
SWARfloor64OverNGoto(unsigned long):
mov eax, OFFSET FLAT:.L3
sub rax, OFFSET FLAT:.L2
imul rax, rdi
add rax, OFFSET FLAT:.L2
jmp rax
.L2:
xor eax, eax
ret
.L3:
mov eax, 64
ret
Подробнее здесь: https://stackoverflow.com/questions/793 ... mpile-this
Почему GCC и Clang не могут это скомпилировать? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1735282832
Anonymous
У меня есть функция C++, которая определяет несколько меток и пытается вычислить целевой адрес на основе входного значения. Затем функция использует оператор goto для перехода к вычисленному адресу. Однако когда я компилирую этот код с помощью GCC или Clang, он использует только первые две метки. (обозреватель компилятора)
Почему GCC и Clang не могут правильно скомпилировать этот код и как это исправить? Такое поведение соответствует стандарту C++ или это ошибка компилятора? Должен ли я сообщить об этом?
#include
#include
#include
uint8_t SWARfloor64OverNGoto(const uint64_t n)
{
// Define the labels
void *label0_address = &&label0;
void *label1_address = &&label1;
// Calculate the offset at compile time
const uint64_t offset = reinterpret_cast(label1_address) - reinterpret_cast(label0_address);
// Compute the target address
void *target = reinterpret_cast(reinterpret_cast(label0_address) + n * offset);
// Jump to the target address
goto *reinterpret_cast(target);
label0:
return 0;
label1:
return 64;
label2:
return 32;
label3:
return 21;
label4:
return 16;
label5:
return 12;
label6:
return 10;
label7:
return 9;
label8:
return 8;
label9:
return 7;
label10:
return 6;
label11:
return 5;
label12:
return 5;
label13:
return 4;
label14:
return 4;
label15:
return 4;
label16:
return 4;
label17:
return 3;
label18:
return 3;
label19:
return 3;
label20:
return 3;
label21:
return 3;
label22:
return 2;
label23:
return 2;
label24:
return 2;
label25:
return 2;
label26:
return 2;
label27:
return 2;
label28:
return 2;
label29:
return 2;
label30:
return 2;
label31:
return 2;
label32:
return 2;
label33:
return 1;
label34:
return 1;
label35:
return 1;
label36:
return 1;
label37:
return 1;
label38:
return 1;
label39:
return 1;
label40:
return 1;
label41:
return 1;
label42:
return 1;
label43:
return 1;
label44:
return 1;
label45:
return 1;
label46:
return 1;
label47:
return 1;
label48:
return 1;
label49:
return 1;
label50:
return 1;
label51:
return 1;
label52:
return 1;
label53:
return 1;
label54:
return 1;
label55:
return 1;
label56:
return 1;
label57:
return 1;
label58:
return 1;
label59:
return 1;
label60:
return 1;
label61:
return 1;
label62:
return 1;
label63:
return 1;
}
Скомпилированный ассемблерный код использует только первые две метки, что не является запланированным.
SWARfloor64OverNGoto(unsigned long):
mov eax, OFFSET FLAT:.L3
sub rax, OFFSET FLAT:.L2
imul rax, rdi
add rax, OFFSET FLAT:.L2
jmp rax
.L2:
xor eax, eax
ret
.L3:
mov eax, 64
ret
Подробнее здесь: [url]https://stackoverflow.com/questions/79311118/why-do-gcc-and-clang-fail-to-compile-this[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия