From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Wed, 14 Sep 2022 15:20:32 +0300 From: "Dmitry V. Levin" To: devel@lists.altlinux.org Message-ID: <20220914122031.GA26760@altlinux.org> References: <20220914111752.67she5b46vzksvvf@titan.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220914111752.67she5b46vzksvvf@titan.localdomain> Subject: Re: [devel] story time: LTO vs weird configure.ac X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Sep 2022 12:20:32 -0000 Archived-At: List-Archive: List-Post: On Wed, Sep 14, 2022 at 03:17:52PM +0400, Ivan A. Melnikov wrote: > Привет. > > Хочу поделиться ещё одной любопытной историей. > > Для обновления boost мне понадобилось пересобрать пакет taler, > однако он отказался пересобираться на aarch64 и ppc64le > c интересной диагностикой: > > secp256k1/src/scalar_4x64_impl.h:748:5: error: unknown register name 'rdx' in 'asm' > secp256k1/src/scalar_4x64_impl.h:748:5: error: unknown register name 'rax' in 'asm' > > и дальше в таком духе. > > Оказалось, что configure этого чуда в вопросах включения > ассемблерных вставок не ориентируется на текущую платформу, > а просто проверяет, что ассембелрные вставки, совместимые > с x86_64, работают, для чего компилирует ($CC -c ...) > такую вот бесхитростную программу: > > $ cat conftest.c > > #include > int > main () > { > > uint64_t a = 11, tmp; > __asm__ __volatile__("movq \$0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); > > ; > return 0; > } > > > Естественно, это чудо не компилируется, например, на aarch64: > > $ aarch64-linux-gnu-gcc -c conftest.c > conftest.c: In function 'main': > conftest.c:8:60: warning: unknown escape sequence: '\$' > 8 | __asm__ __volatile__("movq \$0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); > | ^ > conftest.c:8:3: error: unknown register name '%rdx' in 'asm' > 8 | __asm__ __volatile__("movq \$0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); > | ^~~~~~~ > > > Однако с -flto=auto, прилетающего из %optfags, компилируется: > > $ aarch64-linux-gnu-gcc -c -flto=auto conftest.c > conftest.c: In function 'main': > conftest.c:8:60: warning: unknown escape sequence: '\$' > 8 | __asm__ __volatile__("movq \$0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); > | ^ > $ echo $? > 0 > > Что, опять же, понятно: при таком LTO содержимое такой > ассемблерной вставки будет разбирать только ассемблер > и только на этапе компоновки, внутри lto-шащего плагина ld. > > Замена AC_COMPILE_IFELSE на AC_LINK_IFELSE помогла. Мне кажется, это уже где-то всплывало, но сейчас не помню, где именно. -- ldv