2018/09/19 [水]
embarcadero で、無料 C/C++ コンパイラとして配布されてゐる bcc32c があります。このコンパイラは今までつくられてゐた bcc32 に代はるコンパイラと位置付けられてゐて、将来の主流となるコンパイラと思はれます。新たなコンパイラは clang を基にして作られてゐて、clang に今まで bcc32 に対して追加されてゐた拡張機能などを加へたものになってゐます。
それでそのコンパイラを少し使ってゐたのですが、をかしな所をみつけました。なんと inline 修飾した関数がまるまる消えてしまふのです。次の C 言語のソースコードをコンパイルしようとしてみます。
a.c
- #include <stdio.h>
- inline void print_ok(void)
- {
- puts("ok");
- }
- int main()
- {
- print_ok();
- return 0;
- }
すると、かやうな結果になります。
>
>bcc32c a.c
Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
a.c:
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Error: Unresolved external '_print_ok' referenced from C:\Windows\Temp\A-627497.O
Error: Unable to perform link
bcc32c.exe: error: linker command failed with exit code 2 (use -Xdriver -v to see invocation)
>
print_ok 関数がないとリンカが文句をたれてゐます。ちなみに、bcc32 や clang では全く問題ありません。
>
>bcc32 a.c
Embarcadero C++ 7.30 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
a.c:
Turbo Incremental Link 6.80 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
>a
ok
>
>clang a.c
>a
ok
>
一体、何が起こったのか、アセンブリコードを出力させて見てみると、なんとごっそり print_ok 関数が消えてゐます!もちろん inline 展開もされてゐません。なんと云ふことでせう。
>
>bcc32c -S a.c
Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
a.c:
>type a.s
.file "a.c"
.def _main;
.scl 2;
.type 32;
.endef
.section _TEXT,"xr"
.globl _main
.align 16, 0x90
_main: # @main
# BB#0:
pushl %ebp
movl %esp, %ebp
pushl %eax
movl $0, -4(%ebp)
calll _print_ok
movl $0, %eax
addl $4, %esp
popl %ebp
ret
>
clang をもとに作ってゐるはずなのに、どうしてかうなったのか…。全くの謎です。さらに言へば、何故これが治らずに今でもかうなってゐるのか…。使ってゐる人がゐないのだらうか。ちなみに C++ としてコンパイルすると全く問題なくコンパイルできます。
by seclan