[alsa-devel] [PATCH] ASoC: prevent compilers from optimising pll calculation into __aeabi__uldivmod
21cnbao at gmail.com
Wed Apr 27 10:50:12 CEST 2011
2011/4/27 Takashi Iwai <tiwai at suse.de>:
> At Wed, 27 Apr 2011 16:24:44 +0800,
> Barry Song wrote:
>> 2011/4/27 Takashi Iwai <tiwai at suse.de>:
>> > At Wed, 27 Apr 2011 00:27:32 -0700,
>> > Barry Song wrote:
>> >> From: Barry Song <21cnbao at gmail.com>
>> >> The newest compiliers can optimize pll calculation in several codecs into __aeabi__uldivmod which doesn't exist in kernel.
>> >> Then the link will fail:
>> >> ERROR: "__aeabi_uldivmod" [sound/soc/codecs/snd-soc-wm8974.ko] undefined!
>> >> ERROR: "__aeabi_uldivmod" [sound/soc/codecs/snd-soc-wm8940.ko] undefined!
>> >> ERROR: "__aeabi_uldivmod" [sound/soc/codecs/snd-soc-wm8510.ko] undefined!
>> >> This patch prevent the optimizaton by insert ASM.
>> > Don't do this in the low driver level. If any, we should fix do_div()
>> > instead.
>> do_div is just a macro, it has no problem by itself.
> It has a problem by itself because it's a macro with a side-effect :)
> Could we put an asm to do_div() itself? The asm statement can be
> defined depending on the compiler version.
>> only while
>> working together with other more codes before do_div, gcc can make
>> some codes merging and cause problems.
>> if do_div is a function, we'd just fix it.
> Better to ask this in LKML, then.
I must have been delaying a little from gcc. Michael Hope has thought
it as a gcc bug on 26 April,2011at:
Marking pll_factors() as noinline or putting asm("" : "+r"(source)); before the
call to do_div() works around the problem.
More information about the Alsa-devel