Две копии константы появляются в скомпилированном эльфе - PullRequest
0 голосов
/ 18 мая 2018

Мы в основном используем архитектуру sparc, и наш язык - Ada, мы используем компилятор gnat для компиляции нашего кода.Мы наблюдали что-то смешное.

Некоторые константы в нашем коде имеют две или более копии.

file.adb:

With FileConsts; USE FileConsts
Procedure SomeProcedure is
A : LONG_FLOAT;
Begin
    A := cSomeConstant;
End SomeProcedure;

FileConsts.ads

cSomeConstant : CONSTANT LONG_FLOAT := 100.0;

В файле карты мы в основном

.rodata 0x40010000 (0x8)file.o
.rodata 0x40010008 pfileconsts__csomeconstant

В сборкеон обращается к области file.o, то есть 0x40010000 вместо 0x40010008.В двоичном файле значения 0x40010000 и 0x40010008 фактически одинаковы, поэтому программа работает так, как ожидается.Но зачем компилятору это делать

Если какой-либо другой пакет (file2.adb) также обращается к cSomeConstant, он делает еще одну копию в разделе

.rodata 0x40010010 (0x8)file2.o

Снова значение в двоичном файлесовпадает с cSomeConstant

Почему компилятор ведет себя так?Как подавить это поведение?

Это действительно сбивает с толку при отладке.

1 Ответ

0 голосов
/ 18 мая 2018

Вы должны помнить, что напечатанные «константы» не являются статическими в Аде.

Если вы хотите статическую константу, используйте «именованное число»:

Some_Constant : constant := 100.0;

(я не понимаюНе знаю, какой код сгенерирует компилятор в этом случае.)

...