[LLVMdev] ARM assembler bug on LLVM 3.5

Mikulas Patocka mikulas at artax.karlin.mff.cuni.cz
Mon Sep 22 15:48:54 PDT 2014



On Sun, 21 Sep 2014, Renato Golin wrote:

> On 20 September 2014 15:19, Mikulas Patocka
> <mikulas at artax.karlin.mff.cuni.cz> wrote:
> > The problem is this - you either compile this program with
> > -mcpu=cortex-a9, then clang reports error on the sdiv instruction because
> > cortex a9 doesn't have sdiv. Or - you compile the program with
> > -mcpu=cortex-a15, then clang compiles it, but it uses full cortex-a15
> > instruction set and the program crashes on cortex a9 and earlier cores.
> 
> LLVM always validates inline assembly. This may be too restrictive but
> it has been for a while and there isn't yet a good incentive to turn
> that off, even with a flag. This may change in the future for some
> cases, but your case is not one of them.

What's the purpose of rejecting "sdiv" and other instructions?

I understand that some times ago ARM was used mainly for embedded systems 
and there was no need to write ARM applications portable to different 
cores - so rejecting instructions for different cores didn't do any harm. 
But today it definitelly makes sense to write portable ARM applications 
that run on different cores.

> The problem is that there isn't currently a way to pass flags to the
> integrated assembler as of now (I'm working on it).

gas unlocks all instructions if these directives are used ".cpu 
cortex-a15\n .fpu neon-vfpv4".

LLVM integrated assembler will choke on it and produce invalid object 
file. You can try:
int main(void)
{
        asm volatile (".cpu cortex-a15\n .fpu neon-vfpv4\n");
        return 0;
}
/usr/bin/ld: Warning: /tmp/as-b084f5.o: Unknown EABI object attribute 488
/usr/bin/ld: /tmp/as-b084f5.o: Unknown mandatory EABI object attribute 
8890
/usr/bin/ld: failed to merge target specific data of file /tmp/as-b084f5.o

Maybe, all you need to do is fix handling of these directives in the 
integrated assembler.

> When that starts
> to work, you will be able to just pass "-mcpu=cortex-a9
> -Wa,-mcpu=cortex-a15" and it'll do what you want. That should work on
> GCC, too.
> 
> Right now, -Wa only works with an external assembler.
> 
> 
> > Even if I use -no-integrated-as (as suggested in bug 18864), clang still
> > examines the string in "asm" statement and reports an error. GCC doesn't
> > examine the string in "asm" and works.
> 
> Have you tried passing -Wa,-mcpu=cortex-a15 together with -no-integrated-as?

I have tried it and it doesn't work (clang 3.5 in Ubuntu Trusty on ARM). 
With -no-integrated-as, clang uses the system assembler, but it parses the 
asm string nonetheless and reports an error on sdiv instruction.

Mikulas

> cheers,
> --renato
> 



More information about the llvm-dev mailing list