Почему GCC и Clang не могут это скомпилировать?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему GCC и Clang не могут это скомпилировать?

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/793 ... mpile-this
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»