2016-12-31 2 views
0

Я пытаюсь собрать и установить PostgreSQL в свою систему. Моя операционная система Debian 9 НКУ-4,9 Ниже размещена моя ошибкаКомпиляция Postgresql отключает «fno-агрессивные петли-оптимизации»?

The database cluster will be initialized with locale en_US.UTF-8. The default database encoding has accordingly been set to UTF8. 

creating directory p01/pgsql/data ... ok 
creating subdirectories ... ok 
selecting default max_connections ... 100 
selecting default shared_buffers/max_fsm_pages ... 24MB/153600 
creating configuration files ... ok 
creating template1 database in p01/pgsql/data/base/1 ... ok 
initializing pg_authid ... FATAL: wrong number of index expressions 
STATEMENT: CREATE TRIGGER pg_sync_pg_database AFTER INSERT OR UPDATE OR DELETE ON 

pg_database FOR EACH STATEMENT EXECUTE PROCEDURE flatfile_update_trigger(); 

child process exited with exit code 1 
initdb: removing data directory "p01/pgsql/data" 

В другом посте, пользователь предлагает отключить «FNo-агрессивно-петля-оптимизаций». Но как я могу отключить это? Это параметр в ./configure при компиляции шрифтов. Ниже предложение:

initdb: initializing pg_authid ... FATAL: wrong number of index expressions

Я столкнулся с той же проблемой, после компиляции PostgreSQL 8.1.4 с GCC 4.9.3. Проблема, как представляется, путь Postgres использует для представления массивы переменной длины:

typedef struct 
{ 
    int32  size;   /* these fields must match ArrayType! */ 
    int   ndim; 
    int   flags; 
    Oid   elemtype; 
    int   dim1; 
    int   lbound1; 
    int2  values[1];  /* VARIABLE LENGTH ARRAY */ 
} int2vector;     /* VARIABLE LENGTH STRUCT */ 

В некоторых случаях для петель доступ к «ценности», GCC предполагает, что они будут делать одну итерацию максимум. Контуры, как один ниже (извлеченной из исходного кода Postgres): стандарт

ii->ii_NumIndexAttrs = numKeys; 
for (i = 0; i < numKeys; i++) 
    ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i]; 

может в конечном итоге сводится к чему-то вроде:

ii->ii_NumIndexAttrs = numKeys; 
if (numKeys) 
    ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0]; 

, как выводил глядя на ассемблере, созданный для него:

.L161: 
    testl %r12d, %r12d 
    movl %r12d, 4(%rbx) 
    jle .L162 
    movzwl 40(%r13), %eax 
    movw %ax, 8(%rbx) 
.L162: 

Проблема исчезла после повторной компиляции postgres с отключенной оптимизацией с использованием -fno-агрессивных циклов-оптимизации.

+1

Использование 'int2 values ​​[1];' является примером «struct hack». Стандартный способ записи: 'int values ​​[];', превращая его в элемент гибкого массива (FAM). Компилятор не должен оптимизировать доступ к FAM так, как вы утверждаете, что он это делает. Я отмечаю, что GCC 4.9.3 старая - текущая версия - 6.3.0 (если только релиз с тех пор еще не замечен). Возможно, вы должны использовать более новый компилятор. –

+0

Показанный код определенно имеет неопределенное поведение, и оптимизация gcc делает действительной. Возможно, существует новая версия программного обеспечения с исправленной ошибкой? –

+3

PostgreSQL 8.1.4 довольно старый (похоже, с 2006 года); текущая версия выглядит как 9.6.1. Почему вы используете десятилетнее программное обеспечение? (GCC 4.9, похоже, с 2015 года, что является более поздним, чем я ожидал.В последнее время GCC движется быстрее, чем это было в прошлые времена. Тем не менее, GCC 5 и 6 были выпущены с 4,9, а 4.9.4 - последний релиз в семействе 4.9.x.) –

ответ

0

Спасибо за советы ... Я смог решить проблему.

Вот решение, если у кого-то есть эта проблема.

Для компиляции PostgreSQL 9.0.1 источников с помощью GCC-4.9, я использовал следующую директиву в источнике PostGreSQL:

./configure -prefix=/opt/postgres9.0 CFLAGS="-Wno-aggressive-loop-optimizations" 

WNO-агрессивно-looop-optiimizations отключает агрессивный GCCS оптимизации, избегая ошибок сообщалось в предыдущем сообщение и в обсуждении-лист pgsql-general -> https://www.postgresql.org/message-id/CAOD%3DoQ-kq3Eg5SOvRYOVxDuqibVWC8R0wEivPsMGcyzZY-nfzA%40mail.gmail.com

Надеюсь, что устранение «оптимизации агрессивных циклов GCCs» не вызывает каких-либо ошибок в СУБД.

Смежные вопросы